home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / graphics / mandelv2.4 < prev    next >
Internet Message Format  |  1989-06-21  |  64KB

  1. Path: xanth!ames!oliveb!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i155:  mandelvroom - mandelbrot explorer v2.0, Part04/09
  5. Message-ID: <111389@sun.Eng.Sun.COM>
  6. Date: 21 Jun 89 04:01:30 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2692
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: kevin@uts.amdahl.com (Kevin Clague)
  12. Posting-number: Volume 89, Issue 155
  13. Archive-name: graphics/mandelv20.4
  14.  
  15. # This is a shell archive.
  16. # Remove anything above and including the cut line.
  17. # Then run the rest of the file through 'sh'.
  18. # Unpacked files will be owned by you and have default permissions.
  19. #----cut here-----cut here-----cut here-----cut here----#
  20. #!/bin/sh
  21. # shar: SHell ARchive
  22. # Run the following text through 'sh' to create:
  23. #    ilbmw.c
  24. #    lens.c
  25. #    lists.c
  26. #    main.c
  27. #    makefile
  28. #    mand.c
  29. # This is archive 4 of a 9-part kit.
  30. # This archive created: Tue Jun 20 20:45:28 1989
  31. echo "extracting ilbmw.c"
  32. sed 's/^X//' << \SHAR_EOF > ilbmw.c
  33. X/*----------------------------------------------------------------------*
  34. X * ILBMW.C  Support routines for writing ILBM files.            1/23/86
  35. X * (IFF is Interchange Format File.)
  36. X *
  37. X * By Jerry Morrison and Steve Shaw, Electronic Arts.
  38. X * This software is in the public domain.
  39. X *
  40. X * This version for the Commodore-Amiga computer.
  41. X *----------------------------------------------------------------------*/
  42. X#include "iff/packer.h"
  43. X#include "iff/ilbm.h"
  44. X
  45. X/*---------- InitBMHdr -------------------------------------------------*/
  46. XIFFP InitBMHdr(bmHdr0, bitmap, masking, compression, transparentColor,
  47. X        pageWidth, pageHeight)
  48. X        BitMapHeader *bmHdr0;  struct BitMap *bitmap;
  49. X        WORD masking;        /* Masking */
  50. X    WORD compression;    /* Compression */
  51. X    WORD transparentColor;    /* UWORD */
  52. X    WORD pageWidth, pageHeight;
  53. X    {
  54. X    register BitMapHeader *bmHdr = bmHdr0;
  55. X    register WORD rowBytes = bitmap->BytesPerRow;
  56. X
  57. X    bmHdr->w = rowBytes << 3;
  58. X    bmHdr->h = bitmap->Rows;
  59. X    bmHdr->x = bmHdr->y = 0;    /* Default position is (0,0).*/
  60. X    bmHdr->nPlanes = bitmap->Depth;
  61. X    bmHdr->masking = masking;
  62. X    bmHdr->compression = compression;
  63. X    bmHdr->pad1 = 0;
  64. X    bmHdr->transparentColor = transparentColor;
  65. X    bmHdr->xAspect = bmHdr->yAspect = 1;
  66. X    bmHdr->pageWidth = pageWidth;
  67. X    bmHdr->pageHeight = pageHeight;
  68. X
  69. X    if (pageWidth = 320)
  70. X    switch (pageHeight) {
  71. X        case 200: {bmHdr->xAspect = x320x200Aspect;
  72. X               bmHdr->yAspect = y320x200Aspect; break;}
  73. X        case 400: {bmHdr->xAspect = x320x400Aspect;
  74. X               bmHdr->yAspect = y320x400Aspect; break;}
  75. X        }
  76. X    else if (pageWidth = 640)
  77. X    switch (pageHeight) {
  78. X        case 200: {bmHdr->xAspect = x640x200Aspect;
  79. X               bmHdr->yAspect = y640x200Aspect; break;}
  80. X        case 400: {bmHdr->xAspect = x640x400Aspect;
  81. X               bmHdr->yAspect = y640x400Aspect; break;}
  82. X        }
  83. X
  84. X    return( IS_ODD(rowBytes) ? CLIENT_ERROR : IFF_OKAY );
  85. X    }
  86. X
  87. X/*---------- PutCMAP ---------------------------------------------------*/
  88. XIFFP PutCMAP(context, colorMap, depth)   
  89. X      GroupContext *context;  WORD *colorMap;  UBYTE depth;
  90. X   {
  91. X   register LONG nColorRegs;   
  92. X   IFFP iffp;
  93. X   ColorRegister colorReg;
  94. X
  95. X   if (depth > MaxAmDepth)   depth = MaxAmDepth;
  96. X   nColorRegs = 1 << depth;
  97. X
  98. X   iffp = PutCkHdr(context, ID_CMAP, nColorRegs * sizeofColorRegister);
  99. X   CheckIFFP();
  100. X
  101. X   for ( ;  nColorRegs;  --nColorRegs)  {
  102. X      colorReg.red   = ( *colorMap >> 4 ) & 0xf0;
  103. X      colorReg.green = ( *colorMap      ) & 0xf0;
  104. X      colorReg.blue  = ( *colorMap << 4 ) & 0xf0;
  105. X      iffp = IFFWriteBytes(context, (BYTE *)&colorReg, sizeofColorRegister);
  106. X      CheckIFFP();
  107. X      ++colorMap;
  108. X      }
  109. X
  110. X   iffp = PutCkEnd(context);
  111. X   return(iffp);
  112. X   }
  113. X
  114. X/*---------- PutBODY ---------------------------------------------------*/
  115. X/* NOTE: This implementation could be a LOT faster if it used more of the
  116. X * supplied buffer. It would make far fewer calls to IFFWriteBytes (and
  117. X * therefore to DOS Write). */
  118. XIFFP PutBODY(context, bitmap, mask, bmHdr, buffer, bufsize)
  119. X      GroupContext *context;  struct BitMap *bitmap;  BYTE *mask;
  120. X      BitMapHeader *bmHdr;  BYTE *buffer;  LONG bufsize;
  121. X   {         
  122. X   IFFP iffp;
  123. X   LONG rowBytes = bitmap->BytesPerRow;
  124. X   int dstDepth = bmHdr->nPlanes;
  125. X   Compression compression = bmHdr->compression;
  126. X   int planeCnt;        /* number of bit planes including mask */
  127. X   register int iPlane, iRow;
  128. X   register LONG packedRowBytes;
  129. X   BYTE *buf;
  130. X   BYTE *planes[MaxAmDepth + 1]; /* array of ptrs to planes & mask */
  131. X
  132. X   if ( bufsize < MaxPackedSize(rowBytes)  ||    /* Must buffer a comprsd row*/
  133. X        compression > cmpByteRun1  ||        /* bad arg */
  134. X    bitmap->Rows != bmHdr->h   ||        /* inconsistent */
  135. X    rowBytes != RowBytes(bmHdr->w)  ||    /* inconsistent*/
  136. X    bitmap->Depth < dstDepth   ||        /* inconsistent */
  137. X    dstDepth > MaxAmDepth )            /* too many for this routine*/
  138. X      return(CLIENT_ERROR);
  139. X
  140. X   planeCnt = dstDepth + (mask == NULL ? 0 : 1);
  141. X
  142. X   /* Copy the ptrs to bit & mask planes into local array "planes" */
  143. X   for (iPlane = 0; iPlane < dstDepth; iPlane++)
  144. X      planes[iPlane] = (BYTE *)bitmap->Planes[iPlane];
  145. X   if (mask != NULL)
  146. X      planes[dstDepth] = mask;
  147. X
  148. X   /* Write out a BODY chunk header */
  149. X   iffp = PutCkHdr(context, ID_BODY, szNotYetKnown);
  150. X   CheckIFFP();
  151. X
  152. X   /* Write out the BODY contents */
  153. X   for (iRow = bmHdr->h; iRow > 0; iRow--)  {
  154. X      for (iPlane = 0; iPlane < planeCnt; iPlane++)  {
  155. X
  156. X         /* Write next row.*/
  157. X         if (compression == cmpNone) {
  158. X            iffp = IFFWriteBytes(context, planes[iPlane], rowBytes);
  159. X            planes[iPlane] += rowBytes;
  160. X            }
  161. X
  162. X         /* Compress and write next row.*/
  163. X         else {
  164. X            buf = buffer;
  165. X            packedRowBytes = PackRow(&planes[iPlane], &buf, rowBytes);
  166. X            iffp = IFFWriteBytes(context, buffer, packedRowBytes);
  167. X            }
  168. X
  169. X         CheckIFFP();
  170. X         }
  171. X      }
  172. X
  173. X   /* Finish the chunk */
  174. X   iffp = PutCkEnd(context);
  175. X   return(iffp);
  176. X   }
  177. SHAR_EOF
  178. echo "extracting lens.c"
  179. sed 's/^X//' << \SHAR_EOF > lens.c
  180. X/*
  181. X * MandelVroom 2.0
  182. X *
  183. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  184. X *
  185. X * All rights reserved.
  186. X *
  187. X * Permission is hereby granted to distribute this program's source
  188. X * executable, and documentation for non-comercial purposes, so long as the
  189. X * copyright notices are not removed from the sources, executable or
  190. X * documentation.  This program may not be distributed for a profit without
  191. X * the express written consent of the author Kevin L. Clague.
  192. X *
  193. X * This program is not in the public domain.
  194. X *
  195. X * Fred Fish is expressly granted permission to distribute this program's
  196. X * source and executable as part of the "Fred Fish freely redistributable
  197. X * Amiga software library."
  198. X *
  199. X * Permission is expressly granted for this program and it's source to be
  200. X * distributed as part of the Amicus Amiga software disks, and the
  201. X * First Amiga User Group's Hot Mix disks.
  202. X *
  203. X * contents: this file contains the code that implements the lens effect
  204. X * (pixelized expansion) when zooming in.
  205. X *
  206. X */
  207. X
  208. X#include "mandp.h"
  209. X
  210. X/* Lens algorithm:
  211. X *
  212. X *   Initialization - Create RastPort and BitMap as a work area
  213. X *
  214. X *   Lens Expansion -
  215. X *     Phase 1 (Horizontal Expansion)
  216. X *       1.  Working from left side of NavBox to Right
  217. X *       2.  expand one verticle line from NavBox into temp rastport.
  218. X *       3.  duplicate the line in temp rastport to expansion width
  219. X *       4.  Continue for enough lines to fill the temp rastport
  220. X *
  221. X *     Phase 2 (Verticle Expansion)
  222. X *       1.  Working from top of temp rastport to bottom
  223. X *       2.  expand one horizontal line from temp rastport into Lens
  224. X *           window rastport.
  225. X *       3.  duplicate the line in Lens window rastport to expansion height
  226. X *       4.  Continue for enough lines in the temp rastport
  227. X */
  228. X
  229. X/* These structures are used to hold horizontally expanded view of lenz
  230. X   expansion */
  231. X
  232. Xstatic struct RastPort LensRp;
  233. Xstatic struct BitMap   LensBitMap;
  234. Xstatic LONG   LensWidth, LensHeight;
  235. X
  236. XUBYTE LensOK;
  237. XUBYTE LensOn = 1;
  238. X
  239. X#ifdef TEMPWINDOW
  240. X#define SAFEBLIT
  241. X
  242. Xstatic struct NewWindow NewTemp = {
  243. X   0,12,                     /* start position           */
  244. X   80,80,                    /* width, height            */
  245. X   (UBYTE) 0, (UBYTE) NORMALPEN,
  246. X   MOUSEBUTTONS,             /* IDCMP flags              */
  247. X                             /* MandWind flags           */
  248. X   WINDOWDRAG | NOCAREREFRESH | SMART_REFRESH,
  249. X   (struct Gadget *) NULL,   /* first gadget             */
  250. X   (struct Image *) NULL,    /* user checkmark           */
  251. X   (UBYTE *) NULL,           /* Title                    */
  252. X   (struct Screen *) NULL,   /* pointer to screen        */
  253. X   (struct BitMap *) NULL,   /* pointer to superbitmap   */
  254. X   20,20,-1,-1,              /* sizing                   */
  255. X   CUSTOMSCREEN              /* type of screen           */
  256. X   };
  257. X
  258. Xstatic struct Window *TempWind;
  259. X#endif
  260. X
  261. XAllocLensTemp( Pict )
  262. X  register struct Picture *Pict;
  263. X{
  264. X  LONG Plane;
  265. X  PLANEPTR t;
  266. X
  267. X  extern struct MenuItem LensSub[];
  268. X
  269. X  static LensInited;
  270. X
  271. X  extern struct NewScreen NewScreen;
  272. X
  273. X  if ( !LensOn )
  274. X    return;
  275. X
  276. X  if (LensOK == 1)
  277. X    return;
  278. X
  279. X  if (Pict == Pict->DrawPict)
  280. X    return;
  281. X
  282. X#ifdef TEMPWINDOW
  283. X
  284. X  NewTemp.Width    = Pict->Window->Width;
  285. X  NewTemp.Height   = Pict->DrawPict->Window->Height;
  286. X  NewTemp.LeftEdge = NewScreen.Width - NewTemp.Width-2;
  287. X  NewTemp.TopEdge  = 0;
  288. X  NewTemp.Screen   = screen;
  289. X  TempWind         = OpenWindow( &NewTemp );
  290. X/*WindowToBack( TempWind );*/
  291. X  LensOK = TempWind != NULL;
  292. X
  293. X#else
  294. X
  295. X  if ( ! LensInited ) {
  296. X
  297. X    InitRastPort( &LensRp );
  298. X    LensRp.BitMap = &LensBitMap;
  299. X
  300. X    LensInited = 1;
  301. X  }
  302. X
  303. X  LensWidth  = Pict->Window->Width;
  304. X  LensHeight = Pict->DrawPict->Window->Height;
  305. X
  306. X  InitBitMap( &LensBitMap, (long) NewScreen.Depth, LensWidth, LensHeight);
  307. X
  308. X  for (Plane = 0; Plane < NewScreen.Depth; Plane++) {
  309. X
  310. X    t = (PLANEPTR) AllocRaster(LensWidth,LensHeight);
  311. X    LensBitMap.Planes[Plane] = (PLANEPTR) t;
  312. X
  313. X    if (t == NULL) {
  314. X      FreeLensTemp( );
  315. X      return;
  316. X    }
  317. X  }
  318. X  LensOK = 1;
  319. X
  320. X#endif
  321. X}
  322. X
  323. XFreeLensTemp( )
  324. X{
  325. X  LONG Plane;
  326. X
  327. X  if (LensOK) {
  328. X
  329. X#ifdef TEMPWINDOW
  330. X    CloseWindow( TempWind );
  331. X#else
  332. X
  333. X    for (Plane = 0; Plane < LensBitMap.Depth; Plane++) {
  334. X
  335. X      if (LensBitMap.Planes[Plane]) {
  336. X
  337. X        FreeRaster( (char *) LensBitMap.Planes[Plane],
  338. X                    LensWidth, LensHeight);
  339. X        LensBitMap.Planes[Plane] = NULL;
  340. X      }
  341. X    }
  342. X#endif
  343. X    LensOK = 0;
  344. X  }
  345. X}
  346. X
  347. X#ifdef SAFEBLIT
  348. X
  349. XSafeClipBlit( src_Wind, src_x, src_y,
  350. X              dst_Wind, dst_x, dst_y,
  351. X              width, height, min_terms,
  352. X              line_no )
  353. X
  354. X  struct Window *src_Wind, *dst_Wind;
  355. X  LONG   src_x, src_y, dst_x, dst_y, width, height, min_terms;
  356. X  LONG   line_no;
  357. X{
  358. X
  359. X  if (src_x < 0 || src_x > src_Wind->Width) {
  360. X    printf("Line %d Bad blit src_x %d Width %d\n",
  361. X            line_no,src_x,src_Wind->Width);
  362. X    return;
  363. X  }
  364. X
  365. X  if (src_y < 0 || src_y > src_Wind->Height) {
  366. X    printf("Line %d Bad blit src_y %d Height %d\n",
  367. X            line_no, src_y,src_Wind->Height);
  368. X    return;
  369. X  }
  370. X
  371. X  if (width < 1 || width > src_Wind->Width) {
  372. X    printf("Line %d Bad blit width %d\n",line_no, width);
  373. X    return;
  374. X  }
  375. X
  376. X  if (src_x + width > src_Wind->Width) {
  377. X    printf("Line %d Blit outside %d Width %d \n",
  378. X            line_no,src_x+width,src_Wind->Width);
  379. X    return;
  380. X  }
  381. X
  382. X  if (height < 1 || height > src_Wind->Height) {
  383. X    printf("Line %d Bad blit height %d\n",line_no,height);
  384. X    return;
  385. X  }
  386. X
  387. X  if (src_y + height > src_Wind->Height) {
  388. X    printf("Line %d Blit outside %d Height %d \n",
  389. X            line_no,src_y+height,src_Wind->Height);
  390. X    return;
  391. X  }
  392. X
  393. X  ClipBlit( src_Wind->RPort, src_x, src_y,
  394. X            dst_Wind->RPort, dst_x, dst_y,
  395. X            width, height, min_terms);
  396. X}
  397. X#endif
  398. X
  399. X  /* Do Lens effect using temporary rastort, ClipBlit() with exponential
  400. X     expansion */
  401. X
  402. XLens( Pict )
  403. X  register struct Picture *Pict;
  404. X{
  405. X  struct Picture *DrawPict;
  406. X
  407. X  LONG ExpFactor;
  408. X  LONG MaxHeight,MaxWidth;
  409. X  LONG SrcPos, SrcMax;
  410. X
  411. X  LONG DstPos, DstMax;
  412. X
  413. X  LONG EOL;
  414. X
  415. X  LONG NextPos, AccPos;
  416. X  LONG          AccExp;
  417. X
  418. X  LONG FirstSrc,FirstDst,NumOnes;
  419. X
  420. X  static LONG OldLeft,OldTop,OldExp;
  421. X  LONG Top,Left,Bot,t;
  422. X
  423. X  struct Window   *src_Wind,*dst_Wind;
  424. X  struct RastPort *src_Rp,  *dst_Rp,  *tmp_Rp;
  425. X
  426. X  DrawPict = Pict->DrawPict;
  427. X
  428. X  if (DrawPict == NULL)
  429. X    return;
  430. X
  431. X  CloseZoomBoxList( Pict );
  432. X
  433. X  src_Wind = DrawPict->Window;
  434. X  dst_Wind = Pict->Window;
  435. X
  436. X  src_Rp = src_Wind->RPort;
  437. X  dst_Rp = dst_Wind->RPort;
  438. X
  439. X  if (src_Rp == dst_Rp) return;
  440. X
  441. X#ifdef TEMPWINDOW
  442. X  tmp_Rp = TempWind->RPort;
  443. X#else
  444. X  tmp_Rp = &LensRp;
  445. X#endif
  446. X
  447. X  if ( !LensOK )
  448. X    return;
  449. X
  450. X#ifndef TEMPWINDOW
  451. X  SetRast( tmp_Rp, (long) NORMALPEN );
  452. X#endif
  453. X
  454. X  /* turn the Nav Box upside down, so the bit map is not inverted */
  455. X
  456. X  Top   = Pict->NavTop;
  457. X  Bot   = Pict->NavBot;
  458. X  Left  = Pict->NavLeft;
  459. X
  460. X  if (Bot < Top) {
  461. X    t            = Bot;
  462. X    Bot = Top;
  463. X    Top = t;
  464. X  }
  465. X  if (Pict->NavRight < Left) {
  466. X    Left  = Pict->NavRight;
  467. X  }
  468. X
  469. X  /* Do Horizontal Expansion into a temporary bitmap */
  470. X  /* src = DrawPict */
  471. X  /* dst = Pict */
  472. X
  473. X  MaxHeight = Bot - Top + 1;
  474. X
  475. X  if (MaxHeight == 0)
  476. X    return;
  477. X
  478. X  DstPos = 0;
  479. X
  480. X  DstMax = dst_Wind->Width - Pict->LeftMarg - Pict->RightMarg;
  481. X  SrcMax = src_Wind->Width - DrawPict->RightMarg;
  482. X
  483. X#define SHIFT_FACTOR 8
  484. X
  485. X  AccExp = ((dst_Wind->Height - Pict->TopMarg - Pict->BotMarg)
  486. X            << SHIFT_FACTOR) / MaxHeight;
  487. X
  488. X  if (OldLeft == Left && OldTop == Top && OldExp == AccExp)
  489. X    return;
  490. X
  491. X  Pict->Flags |= LENS_DISPLAYED;
  492. X
  493. X  OldLeft = Left;
  494. X  OldTop  = Top;
  495. X  OldExp  = AccExp;
  496. X
  497. X  AccPos = DstPos << SHIFT_FACTOR;
  498. X
  499. X  EOL = 0;
  500. X  NumOnes = 0;
  501. X
  502. X  for (SrcPos = Left; SrcPos < SrcMax && ! EOL; SrcPos++) {
  503. X
  504. X    AccPos += AccExp;
  505. X    NextPos = AccPos >> SHIFT_FACTOR;
  506. X
  507. X    ExpFactor = NextPos - DstPos;
  508. X
  509. X    /* Accumulate adjacent single line blits */
  510. X
  511. X    if (ExpFactor == 1) {
  512. X      if (NumOnes == 0) {
  513. X        FirstSrc = SrcPos;
  514. X        FirstDst = DstPos;
  515. X      }
  516. X      NumOnes++;
  517. X    } else {
  518. X
  519. X      /* Copy accumulated adjcent single line copies */
  520. X
  521. X      if (NumOnes > 0) {
  522. X
  523. X#ifndef SAFEBLIT
  524. X        ClipBlit( src_Rp,  FirstSrc,  (long) Top,
  525. X                  tmp_Rp,  FirstDst,  0,
  526. X                  NumOnes, MaxHeight, (long) 0xc0 );
  527. X#else
  528. X        SafeClipBlit( src_Wind, FirstSrc,  Top,
  529. X                      TempWind, FirstDst,  0,
  530. X                      NumOnes,  MaxHeight, 0xc0, __LINE__ );
  531. X#endif
  532. X        NumOnes = 0;
  533. X      }
  534. X
  535. X      if (ExpFactor > 1) {
  536. X
  537. X        register LONG WrkPos, WrkOff, Last, DstExp;
  538. X
  539. X        /* Expand Pattern exponentially */
  540. X
  541. X        WrkPos = DstPos + 1;
  542. X        WrkOff = 1;
  543. X        Last = 0;
  544. X        DstExp = 1;
  545. X
  546. X        /* Copy First line */
  547. X
  548. X#ifndef SAFEBLIT
  549. X        ClipBlit( src_Rp, SrcPos,    (long) Top,
  550. X                  tmp_Rp, DstPos,    0,
  551. X                  (long) 1, MaxHeight, (long) 0xc0 );
  552. X#else
  553. X        SafeClipBlit( src_Wind,  SrcPos,  Top,
  554. X                      TempWind,  DstPos,  0,
  555. X                      1,         MaxHeight, 0xc0, __LINE__);
  556. X#endif
  557. X
  558. X        /* Now expand it exponentially */
  559. X
  560. X        do {
  561. X
  562. X          if ( WrkOff + DstExp >= ExpFactor ) {
  563. X            Last = 1;
  564. X            DstExp = ExpFactor - WrkOff;
  565. X          }
  566. X
  567. X          if ( WrkPos + DstExp >= DstMax ) {
  568. X            Last = 1;
  569. X            EOL = 1;
  570. X            DstExp = DstMax - WrkPos;
  571. X          }
  572. X
  573. X          if (DstExp) {
  574. X#ifndef SAFEBLIT
  575. X            ClipBlit( tmp_Rp, DstPos,    0,
  576. X                      tmp_Rp, WrkPos,    0,
  577. X                      DstExp, MaxHeight, (long) 0xc0 );
  578. X#else
  579. X            SafeClipBlit( TempWind,  DstPos,  0,
  580. X                          TempWind,  WrkPos,  0,
  581. X                          DstExp,    MaxHeight, 0xc0, __LINE__);
  582. X#endif
  583. X            WrkPos += DstExp;
  584. X            WrkOff += DstExp;
  585. X
  586. X            DstExp <<= 1;
  587. X          }
  588. X        } while ( ! Last );
  589. X      }
  590. X    }
  591. X    if ((DstPos = NextPos) >= DstMax) EOL = 1;
  592. X  }
  593. X
  594. X  if (NumOnes > 0) {
  595. X
  596. X#ifndef SAFEBLIT
  597. X    ClipBlit( src_Rp,  FirstSrc,  (long) Top,
  598. X              tmp_Rp,  FirstDst,  0,
  599. X              NumOnes, MaxHeight, (long) 0xc0 );
  600. X#else
  601. X    SafeClipBlit( src_Wind,  FirstSrc,  Top,
  602. X                  TempWind,  FirstDst,  0,
  603. X                  NumOnes,   MaxHeight, 0xc0, __LINE__);
  604. X#endif
  605. X  }
  606. X  NumOnes = 0;
  607. X
  608. X  ZoomBox( Pict );
  609. X
  610. X  /* src = DrawPict */
  611. X  /* dst = Pict */
  612. X
  613. X  /* Do Verticle Expansion */
  614. X
  615. X  MaxWidth = dst_Wind->Width - Pict->LeftMarg - Pict->RightMarg;
  616. X
  617. X  DstPos = Pict->TopMarg;
  618. X  DstMax = dst_Wind->Height - Pict->BotMarg;
  619. X  SrcMax = src_Wind->Height;
  620. X
  621. X  EOL = 0;
  622. X
  623. X  AccPos = DstPos << SHIFT_FACTOR;
  624. X
  625. X  for (SrcPos = 0; SrcPos < SrcMax && !EOL; SrcPos++) {
  626. X
  627. X    AccPos += AccExp;
  628. X    NextPos = AccPos >> SHIFT_FACTOR;
  629. X
  630. X    ExpFactor = NextPos - DstPos;
  631. X
  632. X    /* Accumulate adjacent single line blits */
  633. X
  634. X    if (ExpFactor == 1) {
  635. X      if (NumOnes == 0) {
  636. X        FirstSrc = SrcPos;
  637. X        FirstDst = DstPos;
  638. X      }
  639. X      NumOnes++;
  640. X    } else {
  641. X
  642. X      /* Copy accumulated adjacent single line copies */
  643. X
  644. X      if (NumOnes > 0) {
  645. X
  646. X#ifndef SAFEBLIT
  647. X        ClipBlit( tmp_Rp,   0,  FirstSrc,
  648. X                  dst_Rp,   Pict->LeftMarg,  FirstDst,
  649. X                  MaxWidth, NumOnes,   (long) 0xc0 );
  650. X#else
  651. X        SafeClipBlit( TempWind,  0,  FirstSrc,
  652. X                      dst_Wind,  Pict->LeftMarg,  FirstDst,
  653. X                      MaxWidth,  NumOnes,  0xc0, __LINE__);
  654. X#endif
  655. X        NumOnes = 0;
  656. X      }
  657. X
  658. X      if ( ExpFactor > 1 ) {
  659. X
  660. X        register LONG WrkPos, WrkOff, Last, DstExp;
  661. X
  662. X        /* Expand Pattern exponentially */
  663. X
  664. X        WrkPos = DstPos + 1;
  665. X        WrkOff = 1;
  666. X        Last = 0;
  667. X        DstExp = 1;
  668. X
  669. X        /* Copy First Horizontal Line */
  670. X
  671. X#ifndef SAFEBLIT
  672. X        ClipBlit( tmp_Rp,   0, SrcPos,
  673. X                  dst_Rp,   Pict->LeftMarg, DstPos,
  674. X                  MaxWidth, (long) 1, (long) 0xc0 );
  675. X#else
  676. X        SafeClipBlit( TempWind, 0, SrcPos,
  677. X                      dst_Wind, Pict->LeftMarg, DstPos,
  678. X                      MaxWidth, 1,        0xc0, __LINE__ );
  679. X#endif
  680. X        do {
  681. X
  682. X          if ( WrkOff + DstExp >= ExpFactor ) {
  683. X            Last = 1;
  684. X            DstExp = ExpFactor - WrkOff;
  685. X          }
  686. X
  687. X          if ( WrkPos + DstExp >= DstMax ) {
  688. X            Last = 1;
  689. X            EOL = 1;
  690. X            DstExp = DstMax - WrkPos;
  691. X          }
  692. X          if (DstExp) {
  693. X#ifndef SAFEBLIT
  694. X            ClipBlit( dst_Rp,   Pict->LeftMarg, DstPos,
  695. X                      dst_Rp,   Pict->LeftMarg, WrkPos,
  696. X                      MaxWidth, DstExp,   (long) 0xc0 );
  697. X#else
  698. X            SafeClipBlit( dst_Wind, Pict->LeftMarg, DstPos,
  699. X                          dst_Wind, Pict->LeftMarg, WrkPos,
  700. X                          MaxWidth, DstExp,   0xc0, __LINE__ );
  701. X#endif
  702. X            WrkPos += DstExp;
  703. X            WrkOff += DstExp;
  704. X
  705. X            DstExp <<= 1;
  706. X          }
  707. X        } while ( ! Last );
  708. X      }
  709. X    }
  710. X    if ((DstPos = NextPos) >= DstMax) EOL = 1;
  711. X  }
  712. X
  713. X  /* Copy accumulated adjacent single line copies */
  714. X
  715. X  if (NumOnes > 0) {
  716. X#ifndef SAFEBLIT
  717. X    ClipBlit( tmp_Rp,  0,  FirstSrc,
  718. X              dst_Rp,  Pict->LeftMarg,  FirstDst,
  719. X              MaxWidth,NumOnes,   (long) 0xc0 );
  720. X#else
  721. X    SafeClipBlit( TempWind, 0,  FirstSrc,
  722. X                  dst_Wind, Pict->LeftMarg,  FirstDst,
  723. X                  MaxWidth, NumOnes,   0xc0, __LINE__ );
  724. X#endif
  725. X  }
  726. X
  727. X  ZoomBox( Pict );
  728. X}
  729. X
  730. XCloseZoomBoxList( Pict )
  731. X  register struct Picture *Pict;
  732. X{
  733. X  register struct Node    *zNode;
  734. X  register struct Picture *ClosePict;
  735. X           struct Picture *PictAddr();
  736. X
  737. X  zNode = Pict->zList.lh_Head;
  738. X
  739. X  while ( zNode->ln_Succ ) {
  740. X
  741. X    ClosePict = PictAddr( zNode );
  742. X
  743. X    if (Pict != ClosePict) {
  744. X      CloseZoomBox(ClosePict);
  745. X    }
  746. X
  747. X    zNode = zNode->ln_Succ;
  748. X  }
  749. X}
  750. X
  751. X
  752. X
  753. SHAR_EOF
  754. echo "extracting lists.c"
  755. sed 's/^X//' << \SHAR_EOF > lists.c
  756. X/*
  757. X * MandelVroom 2.0
  758. X *
  759. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  760. X *
  761. X * All rights reserved.
  762. X *
  763. X * Permission is hereby granted to distribute this program's source
  764. X * executable, and documentation for non-comercial purposes, so long as the
  765. X * copyright notices are not removed from the sources, executable or
  766. X * documentation.  This program may not be distributed for a profit without
  767. X * the express written consent of the author Kevin L. Clague.
  768. X *
  769. X * This program is not in the public domain.
  770. X *
  771. X * Fred Fish is expressly granted permission to distribute this program's
  772. X * source and executable as part of the "Fred Fish freely redistributable
  773. X * Amiga software library."
  774. X *
  775. X * Permission is expressly granted for this program and it's source to be
  776. X * distributed as part of the Amicus Amiga software disks, and the
  777. X * First Amiga User Group's Hot Mix disks.
  778. X *
  779. X * contents: this file contains functions that create, delete, and performs
  780. X * operations on lists of projects.
  781. X */
  782. X
  783. X#include "mandp.h"
  784. X
  785. Xextern LONG MainPri, TaskPri;
  786. X
  787. X#define LT_PICTLIST 0xff
  788. X#define LT_ZOOMLIST 0xfe
  789. X
  790. Xstruct List pList = {
  791. X  (struct Node *) &pList.lh_Tail,
  792. X  (struct Node *) NULL,
  793. X  (struct Node *) &pList.lh_Head,
  794. X  LT_PICTLIST
  795. X};
  796. X
  797. Xunion PictNode {
  798. X  struct Node    *Node;
  799. X  struct Picture *Pict;
  800. X};
  801. X
  802. Xstruct Picture *
  803. XNewPict( Type )
  804. X  UBYTE Type;
  805. X{
  806. X  register union PictNode ln;
  807. X  register struct List *Head;
  808. X
  809. X  extern struct NewWindow NewMand;
  810. X
  811. X  ln.Pict = (struct Picture *)
  812. X            safeAllocMem( (long) sizeof(struct Picture), (long) MEMF_CLEAR);
  813. X
  814. X  if (ln.Pict == NULL)
  815. X    return( ln.Pict );
  816. X
  817. X  ln.Node->ln_Type = Type;
  818. X  ln.Node->ln_Name = ln.Pict->Title;
  819. X
  820. X#if 0
  821. X  strcpy( ln.Pict->Title, "* ");
  822. X#endif
  823. X
  824. X  if ( Type == MANDPICT ) {
  825. X
  826. X    InitMand( ln.Pict );
  827. X  }
  828. X
  829. X  ln.Pict->NewWind = &NewMand;
  830. X
  831. X  ln.Pict->TopEdge = 12;
  832. X
  833. X  if ( pList.lh_Head->ln_Succ == NULL ) {
  834. X
  835. X    ToggleEnableds();
  836. X  }
  837. X
  838. X  AddHead( &pList, ln.Node );
  839. X
  840. X  ln.Pict->gSigBit = -1;
  841. X
  842. X  Head = &ln.Pict->zList;
  843. X
  844. X  Head->lh_Head     = (struct Node *) &Head->lh_Tail;
  845. X  Head->lh_TailPred = (struct Node *) &Head->lh_Head;
  846. X  Head->lh_Type     = LT_ZOOMLIST;
  847. X
  848. X  ln.Pict->WindowSemi.ss_Link.ln_Name = NULL;
  849. X  ln.Pict->WindowSemi.ss_Link.ln_Pri  = 0;
  850. X
  851. X  AddSemaphore( &ln.Pict->WindowSemi );
  852. X
  853. X  return( ln.Pict );
  854. X}
  855. X
  856. X/* Dale Luck's Add Semaphore code */
  857. X
  858. XmyAddSemaphore( ss )
  859. X  struct SignalSempahore *ss;
  860. X{
  861. X  extern struct ExecBase *SysBase;
  862. X
  863. X  InitSemaphore(ss);
  864. X  Forbid();
  865. X  Enqueue(&SysBase->SemaphoreList, ss);
  866. X  Permit();
  867. X}
  868. X
  869. X
  870. XDisposePict( NPict )
  871. X  register struct Picture *NPict;
  872. X{
  873. X  Remove( &NPict->pNode );
  874. X
  875. X  RemSemaphore( &NPict->WindowSemi );
  876. X
  877. X  if (NPict == CurPict)
  878. X    CurPict = NULL;
  879. X
  880. X  FreeMem( (char *) NPict, (long) sizeof( struct Picture ) );
  881. X
  882. X  if ( pList.lh_Head->ln_Succ == NULL ) {
  883. X
  884. X    ToggleEnableds();
  885. X  }
  886. X}
  887. X
  888. XGetCurPict( )
  889. X{
  890. X  register struct Picture *NewPict;
  891. X
  892. X  if ( pList.lh_Head->ln_Succ ) {
  893. X
  894. X    NewPict = (struct Picture *) pList.lh_Head;
  895. X
  896. X    MakeCurProj( NewPict );
  897. X
  898. X  } else {
  899. X
  900. X    CurPict = NULL;
  901. X  }
  902. X}
  903. X
  904. XThrowPicts()
  905. X{
  906. X  register union PictNode ln;
  907. X  register union PictNode lnt;
  908. X
  909. X  ln.Node = pList.lh_Head;
  910. X
  911. X  while ( ln.Node->ln_Succ ) {
  912. X
  913. X    lnt.Node = ln.Node;
  914. X    ln.Node = ln.Node->ln_Succ;
  915. X    ThrowPict( lnt.Pict );
  916. X  }
  917. X}
  918. X
  919. XThrowPict( Pict )
  920. X  register struct Picture *Pict;
  921. X{
  922. X  ThrowTask( Pict );
  923. X
  924. X  KillReColor( Pict );
  925. X
  926. X  FreeCounts( Pict );
  927. X
  928. X  FreeHist( Pict->Hist );
  929. X  Pict->Hist = NULL;
  930. X
  931. X  ClosePicture( Pict );
  932. X  DisposePict( Pict );
  933. X}
  934. X
  935. XReColorPicts()
  936. X{
  937. X  register union PictNode ln;
  938. X
  939. X  ln.Node = pList.lh_Head;
  940. X
  941. X  while ( ln.Node->ln_Succ ) {
  942. X
  943. X    ReColor( ln.Pict );
  944. X    ln.Node = ln.Node->ln_Succ;
  945. X  }
  946. X}
  947. X
  948. XCheckNewScreen( ViewModes )
  949. X  USHORT ViewModes;
  950. X{
  951. X  register union PictNode ln;
  952. X
  953. X  struct NewScreen MaybeScreen;
  954. X  register struct NewScreen *ns;
  955. X
  956. X  ns = &MaybeScreen;
  957. X
  958. X  ns->ViewModes = ViewModes;
  959. X
  960. X  NewScreenSize( ns );
  961. X
  962. X  ln.Node = pList.lh_Head;
  963. X
  964. X  while ( ln.Node->ln_Succ ) {
  965. X
  966. X    if (ln.Pict->Window && ( ln.Pict->Window->Width  > ns->Width  ||
  967. X                             ln.Pict->Window->Height > ns->Height))
  968. X      return( UNSUCCESSFUL );
  969. X
  970. X    ln.Node = ln.Node->ln_Succ;
  971. X  }
  972. X  return( SUCCESSFUL );
  973. X}
  974. X
  975. XReOpenPicts()
  976. X{
  977. X  register union PictNode ln;
  978. X  register union PictNode temp_ln;
  979. X
  980. X  extern struct NewWindow NewMand;
  981. X
  982. X  ln.Node = pList.lh_Head;
  983. X
  984. X  while ( ln.Node->ln_Succ ) {
  985. X
  986. X    ReleaseSemaphore( &ln.Pict->WindowSemi );
  987. X
  988. X    if ( OpenPicture( ln.Pict ) != 0 ) {
  989. X
  990. X      temp_ln.Node = ln.Node;
  991. X
  992. X      ln.Node = ln.Node->ln_Succ;
  993. X
  994. X      ThrowPict( temp_ln.Pict );
  995. X
  996. X    } else {
  997. X      if ( ln.Pict->Counts && ! (ln.Pict->Flags & NO_RAM_GENERATE) ) {
  998. X        ReColor( ln.Pict );
  999. X      }
  1000. X
  1001. X      AwakenChild( ln.Pict );
  1002. X
  1003. X      if ( ln.Pict->GenState == GENPENDSTATE ) {
  1004. X        Generate( ln.Pict );
  1005. X      }
  1006. X
  1007. X      ln.Node = ln.Node->ln_Succ;
  1008. X    }
  1009. X  }
  1010. X  ServiceTasks();
  1011. X}
  1012. X
  1013. XClosePicts()
  1014. X{
  1015. X  register union PictNode ln;
  1016. X
  1017. X  ln.Node = pList.lh_Head;
  1018. X
  1019. X  while ( ln.Node->ln_Succ ) {
  1020. X
  1021. X    if ( ln.Pict->cTask ) {
  1022. X
  1023. X      KillReColor( ln.Pict );
  1024. X    }
  1025. X
  1026. X
  1027. X
  1028. X    ObtainSemaphore( &ln.Pict->WindowSemi );
  1029. X
  1030. X    ClosePicture( ln.Pict );
  1031. X
  1032. X    ln.Node = ln.Node->ln_Succ;
  1033. X  }
  1034. X}
  1035. X
  1036. XServiceTasks()
  1037. X{
  1038. X  register union PictNode ln;
  1039. X
  1040. X  ln.Node = pList.lh_Head;
  1041. X
  1042. X  while ( ln.Node->ln_Succ ) {
  1043. X
  1044. X    switch( ln.Pict->GenChildState ) {
  1045. X
  1046. X      case NOSIGSTATE:
  1047. X      case GENCOMPLETE:
  1048. X
  1049. X           KillDoneChild( ln.Pict );
  1050. X           SetGenGad( ln.Pict );
  1051. X           ln.Pict->gTask = NULL;
  1052. X           PrintTime( ln.Pict );
  1053. X           break;
  1054. X    }
  1055. X
  1056. X    if ( ln.Pict->ColorChildState == RECOLORCOMPLETE ) {
  1057. X      KillReColor( ln.Pict );
  1058. X      AwakenChild( ln.Pict );
  1059. X    }
  1060. X
  1061. X    ln.Node = ln.Node->ln_Succ;
  1062. X  }
  1063. X}
  1064. X
  1065. XPrintTime( Pict )
  1066. X register struct Picture *Pict;
  1067. X{
  1068. X LONG t2[3];
  1069. X LONG *t1,t;
  1070. X
  1071. X if (FromWB)
  1072. X   return;
  1073. X
  1074. X return;
  1075. X
  1076. X DateStamp(t2);
  1077. X
  1078. X t1 = Pict->TimeStamp;
  1079. X
  1080. X t = ((t2[0]-t1[0]) * 1440 + t2[1] - t1[1]) * 3000 + t2[2] - t1[2] ;
  1081. X
  1082. X printf("time is %ld.%ld seconds\n",t/50,2*(t%50));
  1083. X}
  1084. X
  1085. XReColorLine( Pict )
  1086. X  register struct Picture *Pict;
  1087. X{
  1088. X  register struct RastPort *Rp;
  1089. X  register UBYTE *ColorXLate;
  1090. X  register SHORT *LinePtr;
  1091. X  register LONG   Top;
  1092. X  register LONG   Width;
  1093. X  register struct Window   *Window;
  1094. X
  1095. X  LONG i;
  1096. X
  1097. X  (void) SetTaskPri( Pict->gTask, MainPri );
  1098. X
  1099. X  ObtainSemaphore( &Pict->WindowSemi );
  1100. X
  1101. X  Top     = Pict->CurLine;
  1102. X  Width   = Pict->CountX;
  1103. X  Window  = Pict->Window;
  1104. X
  1105. X  if ( Window ) {
  1106. X
  1107. X    ColorXLate = Pict->ClrXlate;
  1108. X
  1109. X    if ( Pict->Flags & NO_RAM_GENERATE ) {
  1110. X
  1111. X      LinePtr = Pict->Counts;
  1112. X    } else {
  1113. X      LinePtr = Pict->Counts + Top * Width;
  1114. X    }
  1115. X
  1116. X    Top   += Pict->TopMarg;
  1117. X    Width += Pict->LeftMarg;
  1118. X
  1119. X    Rp = Window->RPort;
  1120. X
  1121. X    for (i = Pict->LeftMarg; i < Width; i++) {
  1122. X
  1123. X      SetAPen( Rp, (long) *(ColorXLate + *LinePtr++) );
  1124. X
  1125. X      if ( i < Window->Width - Pict->RightMarg )
  1126. X        WritePixel( Rp, i, Top );
  1127. X    }
  1128. X  }
  1129. X
  1130. X  ReleaseSemaphore( &Pict->WindowSemi );
  1131. X
  1132. X  (void) SetTaskPri( Pict->gTask, TaskPri );
  1133. X}
  1134. SHAR_EOF
  1135. echo "extracting main.c"
  1136. sed 's/^X//' << \SHAR_EOF > main.c
  1137. X/*
  1138. X * MandelVroom 2.0
  1139. X *
  1140. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  1141. X *
  1142. X * All rights reserved.
  1143. X *
  1144. X * Permission is hereby granted to distribute this program's source
  1145. X * executable, and documentation for non-comercial purposes, so long as the
  1146. X * copyright notices are not removed from the sources, executable or
  1147. X * documentation.  This program may not be distributed for a profit without
  1148. X * the express written consent of the author Kevin L. Clague.
  1149. X *
  1150. X * This program is not in the public domain.
  1151. X *
  1152. X * Fred Fish is expressly granted permission to distribute this program's
  1153. X * source and executable as part of the "Fred Fish freely redistributable
  1154. X * Amiga software library."
  1155. X *
  1156. X * Permission is expressly granted for this program and it's source to be
  1157. X * distributed as part of the Amicus Amiga software disks, and the
  1158. X * First Amiga User Group's Hot Mix disks.
  1159. X *
  1160. X * contents: this file contains main(), Workbench support code, and
  1161. X * miscellaneous funtions.
  1162. X */
  1163. X
  1164. X#define COLORCYCLE
  1165. X
  1166. X#include "mandp.h"
  1167. X
  1168. Xextern struct NewScreen NewScreen;
  1169. Xextern struct Picture *ZoomedPict;
  1170. X
  1171. Xextern UBYTE ContOpen, PaletteOpen, CycleOpen, HistOpen;
  1172. X
  1173. Xstruct Window  *CurWind;
  1174. Xstruct Picture *CurPict;
  1175. X
  1176. Xstruct Window *ClosedWind;
  1177. X
  1178. XUBYTE  QuitScreen;
  1179. X
  1180. XSHORT MouseX,MouseY;
  1181. X
  1182. XLONG mSigBit, mSigMask; /* Finished Signal */
  1183. Xstruct Task *mTask;
  1184. X
  1185. Xextern int Num_vp_Colors;
  1186. X
  1187. Xextern LONG MainPri, TaskPri;
  1188. X
  1189. Xextern struct WBStartup *WBenchMsg;
  1190. Xstruct IntuiMessage *ParseMsg;
  1191. X
  1192. XBYTE FromWB;
  1193. X
  1194. X/*
  1195. X * Do it all
  1196. X */
  1197. Xmain (argc, argv)
  1198. X  int   argc;
  1199. X  char *argv[];
  1200. X {
  1201. X  struct WBArg     *arg;
  1202. X  char  *LoadFile;
  1203. X  char  *NameFromLock();
  1204. X
  1205. X  struct Process *Process;
  1206. X
  1207. X  int i, rc;
  1208. X
  1209. X  AllocArrows();
  1210. X
  1211. X  ToggleEnableds();
  1212. X
  1213. X  Menu[CALCULATEMENU].Flags ^= MENUENABLED;
  1214. X
  1215. X  MainPri = FindTask(0)->tc_Node.ln_Pri;
  1216. X  TaskPri = MainPri - 1;
  1217. X
  1218. X  FromWB = argc == 0;
  1219. X
  1220. X  Process = (struct Process *) FindTask(0);
  1221. X
  1222. X  /* Set up Mandelbrot Pict */
  1223. X
  1224. X  if (OpenLibs() == 0 && OpenTasks() == 0 && OpenDisp() == 0) {
  1225. X
  1226. X    DefaultColors();
  1227. X
  1228. X    if (FromWB) {
  1229. X      argc = WBenchMsg->sm_NumArgs;
  1230. X      arg = WBenchMsg->sm_ArgList;
  1231. X    }
  1232. X
  1233. X    if (argc == 1) {
  1234. X
  1235. X      if (SetPreset( 0 ) == UNSUCCESSFUL)
  1236. X        AndDie( "Can't open preset 0. No RAM\n" );
  1237. X
  1238. X    } else {
  1239. X
  1240. X      rc = SUCCESSFUL;
  1241. X
  1242. X      /* get all the projects indicated */
  1243. X
  1244. X      for (i = 1; i < argc && rc == SUCCESSFUL; i++) {
  1245. X
  1246. X        if (FromWB) {
  1247. X
  1248. X          arg++;
  1249. X          rc = LoadPicture( NameFromLock( (struct Lock *) arg->wa_Lock,
  1250. X                                           arg->wa_Name ) );
  1251. X        } else {
  1252. X
  1253. X          rc = LoadPicture( NameFromLock( (struct Lock *)
  1254. X                                           Process->pr_CurrentDir), argv[i]);
  1255. X
  1256. X        }
  1257. X
  1258. X        if (rc == UNSUCCESSFUL) {
  1259. X
  1260. X          DispErrMsg("Failure opening project",0);
  1261. X        } else {
  1262. X
  1263. X          if (CurPict->Flags & NO_RAM_GENERATE)
  1264. X            rc = UNSUCCESSFUL;
  1265. X        }
  1266. X      }
  1267. X    }
  1268. X
  1269. X    DoBrot();
  1270. X  }
  1271. X
  1272. X#ifdef CHECK_TASK_STACK
  1273. X  PrintStack();
  1274. X#endif
  1275. X
  1276. X  ThrowPicts();
  1277. X
  1278. X  CloseTasks();
  1279. X  CloseDisp();
  1280. X  CloseLibs();
  1281. X
  1282. X  FreeArrows();
  1283. X
  1284. X#ifdef MEM_DEBUG
  1285. X  TERMINATE();
  1286. X#endif
  1287. X}
  1288. X
  1289. Xchar *
  1290. XNameFromLock(Lock,WBName)
  1291. X  struct Lock *Lock;
  1292. X  char  *WBName;
  1293. X{
  1294. X  struct FileInfoBlock *fib;
  1295. X  struct Lock *lock,*newlock;
  1296. X
  1297. X  static char cwd[255];
  1298. X
  1299. X  int i,len;
  1300. X  char *name;
  1301. X
  1302. X  i = 255;
  1303. X  cwd[255] = '\0';
  1304. X
  1305. X  len = strlen( WBName );
  1306. X  i -= len;
  1307. X  movmem(WBName, cwd + i, (unsigned) len);
  1308. X
  1309. X  fib = (struct FileInfoBlock *)
  1310. X        safeAllocMem( (long) sizeof(struct FileInfoBlock), MEMF_CLEAR );
  1311. X
  1312. X  if (fib == NULL) {
  1313. X    DispErrMsg("Can't Allocate FileInfoBlock",0);
  1314. X    return(NULL);
  1315. X  }
  1316. X
  1317. X  lock = Lock;
  1318. X
  1319. X  while (lock) {                    /* while the lock is good */
  1320. X
  1321. X    newlock = (struct Lock *) ParentDir(lock);
  1322. X    (void) Examine(lock, fib);
  1323. X
  1324. X    name = fib->fib_FileName;
  1325. X
  1326. X    if (*name == '\0')
  1327. X       name = "ram";
  1328. X    len = strlen(name);
  1329. X
  1330. X    if (newlock) {
  1331. X
  1332. X      i -= len + 1;
  1333. X      movmem(name, cwd + i, (unsigned) len);
  1334. X      cwd[i+len] = '/';
  1335. X
  1336. X    } else {
  1337. X
  1338. X      i -= len + 1;
  1339. X      movmem(name, cwd + i, (unsigned) len);
  1340. X      cwd[i + len] = ':';
  1341. X    }
  1342. X
  1343. X    if (lock != Lock)
  1344. X      UnLock(lock);
  1345. X    lock = newlock;
  1346. X  }
  1347. X  movmem(cwd + i, cwd, (unsigned) 256 - i);
  1348. X
  1349. X  FreeMem( (char *) fib, (long) sizeof(struct FileInfoBlock) );
  1350. X
  1351. X  return( cwd );
  1352. X}
  1353. X
  1354. X/*
  1355. X * Wait and process a message
  1356. X */
  1357. XDoBrot()
  1358. X{
  1359. X  LONG bSigMask = 1 << BackWind->UserPort->mp_SigBit;
  1360. X  LONG rc;
  1361. X
  1362. X  while (QuitScreen == FALSE) {
  1363. X
  1364. X    rc = Wait( bSigMask | mSigMask );
  1365. X
  1366. X    if (rc & bSigMask) DoMsg();
  1367. X    if (rc & mSigMask) ServiceTasks();
  1368. X  }
  1369. X
  1370. X  if (CurPict == NULL) {
  1371. X    GetCurPict();
  1372. X  }
  1373. X}
  1374. X
  1375. X/*
  1376. X * if there is a message, process it
  1377. X */
  1378. XDoMsg()
  1379. X{
  1380. X  register SHORT  MouseMoved, Activate;
  1381. X  register struct IntuiMessage *message;
  1382. X  register struct IntuiMessage *CopyMsg;
  1383. X  struct IntuiMessage LocalMsg;
  1384. X  struct IntuiMessage MouseMsg;
  1385. X  struct IntuiMessage ActiveMsg;
  1386. X
  1387. X  MouseMoved = FALSE;
  1388. X  Activate   = FALSE;
  1389. X
  1390. X  while (message = (struct IntuiMessage *) GetMsg( BackWind->UserPort)) {
  1391. X
  1392. X    if (message->Class == MOUSEMOVE) {
  1393. X      CopyMsg = &MouseMsg;
  1394. X      MouseMoved = TRUE;
  1395. X    } else
  1396. X    if (message->Class == ACTIVEWINDOW) {
  1397. X      CopyMsg  = &ActiveMsg;
  1398. X      Activate = TRUE;
  1399. X    } else {
  1400. X      CopyMsg = &LocalMsg;
  1401. X    }
  1402. X
  1403. X    CopyMsg->Class       = message->Class;
  1404. X    CopyMsg->Code        = message->Code;
  1405. X    CopyMsg->IAddress    = message->IAddress;
  1406. X    CopyMsg->MouseX      = message->MouseX;
  1407. X    CopyMsg->MouseY      = message->MouseY;
  1408. X             MouseX      = message->MouseX;
  1409. X             MouseY      = message->MouseY;
  1410. X    CopyMsg->IDCMPWindow = message->IDCMPWindow;
  1411. X
  1412. X    /* got a message */
  1413. X
  1414. X    ReplyMsg(message);
  1415. X
  1416. X    if (CopyMsg->Class != MOUSEMOVE && CopyMsg->Class != ACTIVEWINDOW) {
  1417. X      if (CopyMsg->Class == MOUSEBUTTONS && MouseMoved) {
  1418. X        ProcessCmd( &MouseMsg );
  1419. X        MouseMoved = FALSE;
  1420. X      }
  1421. X      ProcessCmd( CopyMsg );
  1422. X    }
  1423. X  }
  1424. X
  1425. X  /* If the Mouse moved during the loop, respond to it now */
  1426. X  if ( MouseMoved ) {
  1427. X    ProcessCmd( &MouseMsg );
  1428. X  }
  1429. X
  1430. X  /* If there was one or more WindowActive then service the last one */
  1431. X  if ( Activate ) {
  1432. X    ProcessCmd( &ActiveMsg );
  1433. X  }
  1434. X} /* DoMsg */
  1435. X
  1436. XUBYTE ScreenSizeChanged;
  1437. X
  1438. XMaybeNewScreen()
  1439. X{
  1440. X  int rc;
  1441. X
  1442. X  extern USHORT NewViewModes;
  1443. X  extern UBYTE  NewDepth;
  1444. X
  1445. X#define VIEW_MODE_MASK (HIRES|INTERLACE|EXTRA_HALFBRITE)
  1446. X
  1447. X  if (screen->BitMap.Depth  != NewDepth ||
  1448. X      (screen->ViewPort.Modes & VIEW_MODE_MASK) != NewViewModes ||
  1449. X       ScreenSizeChanged ) {
  1450. X
  1451. X    if (CheckNewScreen( NewViewModes ) == SUCCESSFUL) {
  1452. X
  1453. X      NewScreen.ViewModes = NewViewModes;
  1454. X      NewScreen.Depth = NewDepth;
  1455. X
  1456. X      CloseDisp();
  1457. X      (void) OpenDisp();
  1458. X      rc = 1;
  1459. X    } else {
  1460. X      DispErrMsg("Can't change screen. Projects too big",0);
  1461. X      rc = 0;
  1462. X    }
  1463. X    ScreenSizeChanged = 0;
  1464. X  } else {
  1465. X    rc = 0;
  1466. X  }
  1467. X  NewViewModes = NewScreen.ViewModes;
  1468. X  NewDepth = NewScreen.Depth;
  1469. X  return( rc );
  1470. X}
  1471. X
  1472. XActivatePict( Window )
  1473. X  register struct Window *Window;
  1474. X{
  1475. X  SetMouse( Window );
  1476. X
  1477. X  CurWind = Window;
  1478. X
  1479. X  DisplayMsg();
  1480. X}
  1481. X
  1482. XCloseWinds( Window )
  1483. X  register struct Window *Window;
  1484. X{
  1485. X  register struct Picture *NewPict;
  1486. X  extern UBYTE ContOpen, OrbitOpen, StatsOpen;
  1487. X
  1488. X  ForceNormPointer();
  1489. X
  1490. X  if ( Window == ContWind) {
  1491. X
  1492. X    CloseContWind();
  1493. X    ContOpen = 0;
  1494. X
  1495. X  } else
  1496. X  if ( Window == HistWind) {
  1497. X
  1498. X    CloseHistWind();
  1499. X    HistOpen = 0;
  1500. X
  1501. X  } else
  1502. X  if ( Window == PalWind) {
  1503. X
  1504. X    ClosePalWind();
  1505. X    PaletteOpen = 0;
  1506. X
  1507. X  } else
  1508. X  if ( Window == CycWind) {
  1509. X
  1510. X    CloseCycWind();
  1511. X    CycleOpen = 0;
  1512. X
  1513. X  } else
  1514. X  if ( Window == HelpWind) {
  1515. X
  1516. X    CloseHelpWind(0,NULL);
  1517. X
  1518. X  } else
  1519. X  if ( Window == StatsWind) {
  1520. X
  1521. X    CloseStatsWind();
  1522. X    StatsOpen = 0;
  1523. X
  1524. X  } else
  1525. X  if ( Window == OrbitWind) {
  1526. X
  1527. X    CloseOrbitWind();
  1528. X    OrbitOpen = 0;
  1529. X
  1530. X  } else {
  1531. X
  1532. X    if ( NewPict = (struct Picture *) Window->UserData  ) {
  1533. X
  1534. X      /* Erase the Zoom box if it is open */
  1535. X
  1536. X      if (NewPict->DrawPict)
  1537. X        ZoomOnOff( NewPict );
  1538. X
  1539. X      /* Undo any pictures that have zoom boxes open in this window */
  1540. X
  1541. X      CloseZoomedPicts( NewPict );
  1542. X
  1543. X      ThrowPict( NewPict );
  1544. X
  1545. X      /* Figure out who is next */
  1546. X
  1547. X      GetCurPict();
  1548. X
  1549. X      if (CurPict == NULL) {
  1550. X
  1551. X        /* Close the contour window */
  1552. X
  1553. X        CloseContWind();  ContOpen    = 0;
  1554. X        ClosePalWind();   PaletteOpen = 0;
  1555. X        CloseCycWind();   CycleOpen   = 0;
  1556. X        CloseOrbitWind(); OrbitOpen   = 0;
  1557. X        CloseHistWind();  HistOpen    = 0;
  1558. X        CloseStatsWind(); StatsOpen   = 0;
  1559. X      } else {
  1560. X
  1561. X        LoadRGB4(vp, CurPict->RGBs, (long) Num_vp_Colors);
  1562. X        RefreshContours();
  1563. X      }
  1564. X    }
  1565. X  }
  1566. X}
  1567. X
  1568. XToggleEnableds( )
  1569. X{
  1570. X  extern struct MenuItem ProjectItems[];
  1571. X  extern struct MenuItem DisplayItems[];
  1572. X  extern struct MenuItem SpecialItems[];
  1573. X  extern struct Menu     Menu[];
  1574. X
  1575. X  ProjectItems[CURITEM].Flags   ^= ITEMENABLED;
  1576. X  ProjectItems[SAVEPROJ].Flags  ^= ITEMENABLED;
  1577. X  ProjectItems[CLOSEPROJ].Flags ^= ITEMENABLED;
  1578. X  ProjectItems[SAVEILBM].Flags  ^= ITEMENABLED;
  1579. X
  1580. X  DisplayItems[COLORITEM].Flags     ^= ITEMENABLED;
  1581. X  DisplayItems[CYCLEITEM].Flags     ^= ITEMENABLED;
  1582. X  DisplayItems[CONTOURITEM].Flags   ^= ITEMENABLED;
  1583. X  DisplayItems[AUTOCNTRITEM].Flags  ^= ITEMENABLED;
  1584. X  DisplayItems[HISTOGRAMITEM].Flags ^= ITEMENABLED;
  1585. X  DisplayItems[BORDERITEM].Flags    ^= ITEMENABLED;
  1586. X
  1587. X  Menu[CALCULATEMENU].Flags ^= MENUENABLED;
  1588. X
  1589. X  SpecialItems[ORBITITEM].Flags     ^= ITEMENABLED;
  1590. X  SpecialItems[ORBITMATHITEM].Flags ^= ITEMENABLED;
  1591. X  SpecialItems[MAXORBITEM].Flags    ^= ITEMENABLED;
  1592. X}
  1593. X
  1594. XBorderWindow( Window )
  1595. X  register struct Window *Window;
  1596. X{
  1597. X  register struct RastPort *Rp;
  1598. X  register LONG   Bottom, Right;
  1599. X  register struct Picture *Pict;
  1600. X  register LONG   Max;
  1601. X  struct Gadget *Sizing;
  1602. X  int      Top;
  1603. X
  1604. X  extern struct Gadget *OrbitResize;
  1605. X
  1606. X  Pict = (struct Picture *) Window->UserData;
  1607. X
  1608. X  if (Pict && (Pict->Flags & BORDERLESS_PROJ))
  1609. X    return;
  1610. X
  1611. X  Bottom = Window->Height - 1;
  1612. X  Right  = Window->Width  - 1;
  1613. X
  1614. X  Rp = Window->RPort;
  1615. X
  1616. X  if (Pict || Window == OrbitWind) {
  1617. X
  1618. X    if (Pict) {
  1619. X      ObtainSemaphore( &Pict->WindowSemi );
  1620. X      Sizing = Pict->SizingGadget;
  1621. X    } else {
  1622. X      Sizing = OrbitResize;
  1623. X    }
  1624. X
  1625. X    SetAPen( Rp, NORMALPEN );
  1626. X
  1627. X    Move( Rp, LEFTMARG,                Bottom - 1);
  1628. X    Draw( Rp, Right - RIGHTMARG/2 - 1, Bottom - 1);
  1629. X
  1630. X    if (Pict) {
  1631. X      if (Pict->pNode.ln_Type == MANDPICT) {
  1632. X        Max = 10+4*14;
  1633. X      } else {
  1634. X        Max = 10+5*14;
  1635. X      }
  1636. X    } else {
  1637. X      Max = 10+1*14;
  1638. X    }
  1639. X
  1640. X    if ( Bottom > Max ) {
  1641. X
  1642. X      RectFill( Rp, Right - RIGHTMARG + 1, Max, Right - 1, Bottom - 1);
  1643. X      RefreshGadgets( Window->FirstGadget, Window, NULL);
  1644. X    }
  1645. X
  1646. X    /* Bevel the resize gadget edges */
  1647. X
  1648. X    Max = Right + Sizing->LeftEdge;
  1649. X    Top = Bottom+ Sizing->TopEdge-1+YScale;
  1650. X
  1651. X    SetAPen( Rp, HIGHLIGHTPEN );
  1652. X    Move(Rp, Max,            Bottom-2+YScale);
  1653. X    Draw(Rp, Max,            Top);
  1654. X    Draw(Rp, Right-2+XScale, Top);
  1655. X    SetAPen( Rp, SHADOWPEN );
  1656. X    Move(Rp, Right-2+XScale, Top+1);
  1657. X    Draw(Rp, Right-2+XScale, Bottom-2+YScale);
  1658. X    Draw(Rp, Max,            Bottom-2+YScale);
  1659. X  }
  1660. X
  1661. X  SetAPen( Rp, SHADOWPEN );
  1662. X  WritePixel( Rp, (long) 0, TOPMARG );
  1663. X
  1664. X  Move( Rp, (long) 0,  Bottom );
  1665. X  Draw( Rp, Right,     Bottom );
  1666. X  Draw( Rp, Right,     TOPMARG);
  1667. X
  1668. X  SetAPen( Rp, HIGHLIGHTPEN );
  1669. X
  1670. X  Move( Rp, (long) 0,     TOPMARG + 1);
  1671. X  Draw( Rp, (long) 0,     Bottom - 1 );
  1672. X
  1673. X  if (Pict)
  1674. X    ReleaseSemaphore( &Pict->WindowSemi );
  1675. X}
  1676. X
  1677. XMakeCurProj( NewPict )
  1678. X  register struct Picture *NewPict;
  1679. X{
  1680. X  extern USHORT NewViewModes;
  1681. X  extern UBYTE  NewDepth;
  1682. X
  1683. X  if ( NewPict ) {
  1684. X
  1685. X    if ( NewPict != CurPict ) {
  1686. X
  1687. X      SetWindowActive( NewPict->Window , '*' );
  1688. X
  1689. X      if (CurPict) {
  1690. X        SetWindowActive( CurPict->Window, ' ' );
  1691. X      }
  1692. X      SetOnString( NewPict->CycleOn );
  1693. X
  1694. X      KillCycle();
  1695. X
  1696. X      CurPict = NewPict;
  1697. X
  1698. X      NewViewModes = NewPict->ViewModes;
  1699. X      NewDepth     = NewPict->Depth;
  1700. X
  1701. X      InitGenSubs();
  1702. X      InitBorderSubs();
  1703. X      InitOrbitSubs();
  1704. X
  1705. X      if (MaybeNewScreen() == 0) {
  1706. X
  1707. X        LoadRGB4(vp, NewPict->RGBs, (long) Num_vp_Colors);
  1708. X        SetColorProps(CurPen);
  1709. X
  1710. X        ReDoHist(CurPict);
  1711. X        ShowStats(CurPict);
  1712. X        RefreshContours();
  1713. X      }
  1714. X
  1715. X      ModifySpeedPot();
  1716. X      SetDirGadget(CurPict);
  1717. X
  1718. X      if (CurPict->CycleOn) {
  1719. X        CreateCycle();
  1720. X      }
  1721. X    }
  1722. X  }
  1723. X}
  1724. X
  1725. SHAR_EOF
  1726. echo "extracting makefile"
  1727. sed 's/^X//' << \SHAR_EOF > makefile
  1728. XSCR = dev:mand/src/screensave
  1729. XREQ = dev:mand/src/req
  1730. X
  1731. XSCROBJS = $(SCR)/SaveILBM.o $(SCR)/packer.o $(SCR)/ilbmw.o $(SCR)/iffw.o
  1732. X
  1733. XREQOBJS = $(REQ)/getfile.o $(REQ)/safeclose.o
  1734. X
  1735. XMANDOBJS = safeAddHead.o orbit.o orbitint.o hist.o help.o showhelp.o\
  1736. X cycle.o cycleII.o menu.o disp.o gadgets.o nav.o lens.o contour.o cmd.o\
  1737. X recolor.o palette.o savemand.o status.o getint.o menu1.o presets.o\
  1738. X main.o tasks.o lists.o mandffp.o mand881.o mandIEEE.o mandInt32.o mand.o\
  1739. X scroll.o SaveILBM.o packer.o ilbmw.o iffw.o getfile.o safeclose.o
  1740. X
  1741. XOBJECTS  = $(MANDOBJS)
  1742. X
  1743. XDEFINES  = -DMULTI
  1744. XCCFLAGS  = +c +l -n +IMand.p $(DEFINES)
  1745. X
  1746. XMandelVroom: mand.p $(OBJECTS)
  1747. X             ln $(OBJECTS) -lma32 -lm32 -lc32 -o MandelVroom -g -w
  1748. X
  1749. Xmand.p:  mandp.h
  1750. X         cc mandp.h +c +l -n +Hmand.p $(DEFINES) +fi
  1751. X
  1752. Xmain.o:  mand.p main.c
  1753. X         cc main.c $(CCFLAGS) +fi
  1754. X
  1755. Xcmd.o:   mand.p cmd.c
  1756. X         cc cmd.c $(CCFLAGS) +fi
  1757. X
  1758. Xmand.o:  mand.p mand.c
  1759. X         cc mand.c $(CCFLAGS) +fi
  1760. X
  1761. XmandIEEE.o:  mand.p mandIEEE.c
  1762. X         cc mandIEEE.c $(CCFLAGS) +fi
  1763. X
  1764. XmandInt32.o:  mand.p mandInt32.c
  1765. X         cc mandInt32.c $(CCFLAGS) +fi
  1766. X
  1767. Xmandffp.o:  mand.p mandffp.c
  1768. X         cc mandffp.c $(CCFLAGS) +ff
  1769. X
  1770. Xmand881.o:  mand.p mand881.c
  1771. X         cc mand881.c $(CCFLAGS) +f8
  1772. X
  1773. Xdisp.o:  mand.p disp.c
  1774. X         cc disp.c $(CCFLAGS) +fi
  1775. X
  1776. Xlists.o:  mand.p lists.c
  1777. X         cc lists.c $(CCFLAGS) +fi
  1778. X
  1779. Xtasks.o:  mand.p tasks.c
  1780. X         cc tasks.c $(CCFLAGS) +fi
  1781. X
  1782. Xgadgets.o:  mand.p gadgets.c
  1783. X         cc gadgets.c $(CCFLAGS) +fi
  1784. X
  1785. Xnav.o:   mand.p nav.c
  1786. X         cc nav.c $(CCFLAGS) +fi
  1787. X
  1788. Xlens.o:  mand.p lens.c
  1789. X         cc lens.c $(CCFLAGS) +fi
  1790. X
  1791. Xcontour.o:  mand.p contour.c
  1792. X         cc contour.c $(CCFLAGS) +fi -E200
  1793. X
  1794. Xhist.o:  mand.p hist.c
  1795. X         cc hist.c $(CCFLAGS) +fi
  1796. X
  1797. Xrecolor.o:  mand.p recolor.c
  1798. X         cc recolor.c $(CCFLAGS) +fi
  1799. X
  1800. Xpalette.o:  mand.p palette.c
  1801. X         cc palette.c $(CCFLAGS) +fi
  1802. X
  1803. Xsavemand.o:     mand.p savemand.c
  1804. X         cc savemand.c $(CCFLAGS) +fi
  1805. X
  1806. Xmenu.o: mand.p menu.c
  1807. X         cc menu.c $(CCFLAGS) +fi
  1808. X
  1809. Xmenu1.o: mand.p menu1.c
  1810. X         cc menu1.c $(CCFLAGS) +fi
  1811. X
  1812. Xpresets.o: mand.p presets.c
  1813. X         cc presets.c $(CCFLAGS) +fi
  1814. X
  1815. Xscrollit.o: mand.p scrollit.c
  1816. X         cc scrollit.c $(CCFLAGS) +fi
  1817. X
  1818. Xstatus.o: mand.p status.c
  1819. X         cc status.c $(CCFLAGS) +fi
  1820. X
  1821. Xgetint.o: mand.p getint.c
  1822. X         cc getint.c $(CCFLAGS) +fi
  1823. X
  1824. Xhelp.o:  mand.p help.c
  1825. X         cc help.c $(CCFLAGS) +fi
  1826. X
  1827. Xshowhelp.o: mand.p showhelp.c
  1828. X         cc showhelp.c $(CCFLAGS) +fi
  1829. X
  1830. Xcycle.o: mand.p cycle.c
  1831. X         cc cycle.c $(CCFLAGS) +fi
  1832. X
  1833. XcycleII.o: mand.p cycleII.c
  1834. X         cc cycleII.c $(CCFLAGS) +fi
  1835. X
  1836. Xorbit.o: mand.p orbit.c
  1837. X         cc orbit.c $(CCFLAGS) +fi
  1838. X
  1839. Xorbitint.o: mand.p orbitint.c
  1840. X         cc orbitint.c $(CCFLAGS) +fi
  1841. X
  1842. Xscroll.o: mand.p scroll.c
  1843. X         cc scroll.c $(CCFLAGS) +fi
  1844. X
  1845. XsafeAddHead.o: mand.p safeAddHead.c
  1846. X         cc safeAddHead.c +l -n
  1847. X
  1848. XSaveILBM.o :    SaveILBM.c
  1849. X         cc +l -n SaveILBM.c
  1850. X
  1851. Xiffw.o :        iffw.c
  1852. X         cc +l -n iffw.c
  1853. X
  1854. Xilbmw.o :       ilbmw.c
  1855. X         cc +l -n ilbmw.c
  1856. X
  1857. Xpacker.o :      packer.c
  1858. X         cc +l -n packer.c
  1859. X
  1860. Xsafeclose.o: safeclose.c
  1861. X  cc safeclose.c +l -n -s
  1862. X
  1863. Xgetfile.o: getfile.c
  1864. X  cc getfile.c +l -n -s
  1865. X
  1866. SHAR_EOF
  1867. echo "extracting mand.c"
  1868. sed 's/^X//' << \SHAR_EOF > mand.c
  1869. X/*
  1870. X * MandelVroom 2.0
  1871. X *
  1872. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  1873. X *
  1874. X * All rights reserved.
  1875. X *
  1876. X * Permission is hereby granted to distribute this program's source
  1877. X * executable, and documentation for non-comercial purposes, so long as the
  1878. X * copyright notices are not removed from the sources, executable or
  1879. X * documentation.  This program may not be distributed for a profit without
  1880. X * the express written consent of the author Kevin L. Clague.
  1881. X *
  1882. X * This program is not in the public domain.
  1883. X *
  1884. X * Fred Fish is expressly granted permission to distribute this program's
  1885. X * source and executable as part of the "Fred Fish freely redistributable
  1886. X * Amiga software library."
  1887. X *
  1888. X * Permission is expressly granted for this program and it's source to be
  1889. X * distributed as part of the Amicus Amiga software disks, and the
  1890. X * First Amiga User Group's Hot Mix disks.
  1891. X *
  1892. X * contents: this file contains funtions to create, maintain and delete
  1893. X * Mandelbrot and Julia projects (including spawning off child generator
  1894. X * tasks.)
  1895. X */
  1896. X
  1897. X#include "mandp.h"
  1898. X
  1899. Xstruct NewWindow NewMand = {
  1900. X   0,12,                     /* start position           */
  1901. X   80,80,                    /* width, height            */
  1902. X
  1903. X   (UBYTE) 0, (UBYTE) NORMALPEN,
  1904. X   NULL,                     /* IDCMP flags */
  1905. X   /* MandWind flags */
  1906. X   WINDOWCLOSE | WINDOWDEPTH | WINDOWSIZING | WINDOWDRAG | ACTIVATE |
  1907. X   REPORTMOUSE | NOCAREREFRESH | SMART_REFRESH,
  1908. X   (struct Gadget *) NULL,   /* first gadget             */
  1909. X   (struct Image *) NULL,    /* user checkmark           */
  1910. X   (UBYTE *) NULL,           /* Title                    */
  1911. X   (struct Screen *) NULL,   /* pointer to screen        */
  1912. X   (struct BitMap *) NULL,   /* pointer to superbitmap   */
  1913. X   20,20,-1,-1,              /* sizing                   */
  1914. X   CUSTOMSCREEN              /* type of screen           */
  1915. X   };
  1916. X
  1917. XLONG TopMarg   = 10;
  1918. XLONG BotMarg   =  2;
  1919. XLONG LeftMarg  =  2;
  1920. XLONG RightMarg;
  1921. X
  1922. XULONG CalcTime;
  1923. X
  1924. Xextern LONG TaskPri, MainPri;
  1925. Xextern LONG pSigMask;
  1926. X
  1927. Xextern struct ExecBase *ExecBase;
  1928. X
  1929. Xstatic struct Picture *GenNPict;
  1930. X
  1931. X/* Toggle generation of project */
  1932. X
  1933. XGenerateCmd(Msg)
  1934. X  struct IntuiMessage *Msg;
  1935. X{
  1936. X  switch(Msg->Class) {
  1937. X
  1938. X    case GADGETDOWN:
  1939. X         ToggleGen((struct Picture *) Msg->IDCMPWindow->UserData);
  1940. X         break;
  1941. X
  1942. X    case MENUPICK:
  1943. X         switch( SUBNUM(Msg->Code) ) {
  1944. X           case STARTGEN:
  1945. X
  1946. X             CurPict->GenState = GENPENDSTATE;
  1947. X             Generate( CurPict );
  1948. X             break;
  1949. X
  1950. X           case STOPGEN:
  1951. X
  1952. X             ThrowTask(CurPict);
  1953. X             break;
  1954. X
  1955. X           case CONTGEN:
  1956. X
  1957. X             CurPict->GenState = CONTINUESTATE;
  1958. X             Generate( CurPict );
  1959. X             break;
  1960. X         }
  1961. X         break;
  1962. X  }
  1963. X}
  1964. X
  1965. XToggleGen( Pict )
  1966. X  struct Picture *Pict;
  1967. X{
  1968. X  if ( Pict->gTask ) {
  1969. X
  1970. X    ThrowTask( Pict );
  1971. X  } else {
  1972. X
  1973. X    Pict->GenState = GENPENDSTATE;
  1974. X    Generate( Pict );
  1975. X  }
  1976. X  SetGenGad( Pict );
  1977. X}
  1978. X
  1979. X/*
  1980. X * Generate It
  1981. X */
  1982. XGenerate( Pict )
  1983. X  register struct Picture *Pict;
  1984. X{
  1985. X
  1986. X  register char *t;
  1987. X
  1988. X  int GenTask();
  1989. X
  1990. X  extern struct MenuItem LensSub[];
  1991. X
  1992. X  if ( Pict->gTask ) {
  1993. X    return;
  1994. X  }
  1995. X
  1996. X  if (Pict->Flags & SCROLL_HAPPENED) {
  1997. X
  1998. X    /* create a new counts array with unclipped data in it */
  1999. X    /* adjust the real and imaginary upper left */
  2000. X
  2001. X    ScrollComplex(Pict);
  2002. X
  2003. X    if (Pict->Counts == NULL)
  2004. X      return;
  2005. X
  2006. X  } else {
  2007. X
  2008. X    FreeScrollTemp(Pict);
  2009. X
  2010. X    if (Pict->GenState == CONTINUESTATE ){
  2011. X      if ( Pict->CurLine < Pict->CountY ) {
  2012. X        if (Pict->Counts == NULL) return;
  2013. X      } else {
  2014. X        return;
  2015. X      }
  2016. X    }
  2017. X
  2018. X    if (Pict->GenState == GENPENDSTATE) {
  2019. X
  2020. X      InitNewGen( Pict );
  2021. X      if (Pict->Counts == NULL) return;
  2022. X    }
  2023. X  }
  2024. X  ResetScrollRects(Pict);
  2025. X
  2026. X  Pict->GenState = GENERATESTATE;
  2027. X
  2028. X  if ( Pict->MathMode == INTIIGENERATOR &&
  2029. X      (ExecBase->AttnFlags & (1 << AFB_68020)) == 0 ) {
  2030. X
  2031. X    Pict->MathMode = INTGENERATOR;
  2032. X  }
  2033. X
  2034. X  if ( Pict->MathMode == _81GENERATOR &&
  2035. X       (ExecBase->AttnFlags & (1 << AFB_68881)) == 0 ) {
  2036. X
  2037. X    Pict->MathMode = IEEEGENERATOR;
  2038. X  }
  2039. X
  2040. X  MakeColorXlate( Pict );
  2041. X
  2042. X  if (Pict->MathMode == 1) {
  2043. X
  2044. X    if (OpenFFPLibs() != 0)
  2045. X      return;
  2046. X  }
  2047. X
  2048. X  /* Spawn off the generator as a task */
  2049. X
  2050. X  DateStamp( Pict->TimeStamp );
  2051. X
  2052. X  /* GenNPict is pointer to Picture that task needs to generate */
  2053. X
  2054. X  GenNPict = Pict;
  2055. X
  2056. X#define KAY (1024L)
  2057. X
  2058. X#ifdef MULTI
  2059. X  Pict->gTask = CreateTask( Pict->Title+2, MainPri, GenTask, KAY);
  2060. X
  2061. X  if ( Pict->gTask == NULL ) {
  2062. X    DispErrMsg("Could not create task",0);
  2063. X  }
  2064. X
  2065. X  SetGenGad( Pict );
  2066. X
  2067. X  /* Do this so we are sure child is done with GenNPict */
  2068. X
  2069. X  Wait( pSigMask );
  2070. X
  2071. X#else
  2072. X  GenTask();
  2073. X#endif
  2074. X}
  2075. X
  2076. XInitNewGen( Pict )
  2077. X  register struct Picture *Pict;
  2078. X{
  2079. X
  2080. X  if (Pict->Flags & BORDERLESS_PROJ) {
  2081. X
  2082. X    Pict->LeftMarg  = 0;
  2083. X    Pict->RightMarg = 0;
  2084. X    Pict->TopMarg   = 0;
  2085. X    Pict->BotMarg   = 0;
  2086. X  }
  2087. X
  2088. X  /* figure out new picture size */
  2089. X
  2090. X  Pict->CountX = Pict->Window->Width-(Pict->LeftMarg+Pict->RightMarg);
  2091. X  Pict->CountY = Pict->Window->Height-(Pict->TopMarg+Pict->BotMarg);
  2092. X
  2093. X  /* free up old counts memory, get new picture size, get new counts memory
  2094. X   */
  2095. X
  2096. X  GetCountsMemory( Pict );
  2097. X
  2098. X  if (Pict->Counts == NULL) {
  2099. X    DispErrMsg("Can't generate. Out of RAM!!",0);
  2100. X    return;
  2101. X  }
  2102. X
  2103. X  if (Pict->Flags & NO_RAM_GENERATE ) {
  2104. X    DispErrMsg("Can't save counts. Out of RAM!!",0);
  2105. X  }
  2106. X
  2107. X  /* calculate new picture's coordinates from zoom box */
  2108. X
  2109. X  ZoomIn( Pict );
  2110. X  Pict->CurLine = 0;
  2111. X
  2112. X  /* clear the picture area */
  2113. X
  2114. X  if (!(Pict->Flags & LENS_DISPLAYED)) {
  2115. X
  2116. X    SetAPen(  Pict->Window->RPort, NORMALPEN );
  2117. X    RectFill( Pict->Window->RPort, Pict->LeftMarg, Pict->TopMarg,
  2118. X              Pict->Window->Width - Pict->RightMarg - 1,
  2119. X              Pict->Window->Height - Pict->BotMarg - 1);
  2120. X  }
  2121. X}
  2122. X
  2123. XGenTask() {
  2124. X
  2125. X  register struct Picture *Pict;
  2126. X
  2127. X  int MandelbrotInt32();
  2128. X  int MandelbrotInt32II();
  2129. X  int MandelbrotIEEE();
  2130. X  int MandelbrotFFP();
  2131. X
  2132. X  int JuliaInt32();
  2133. X  int JuliaIEEE();
  2134. X  int JuliaFFP();
  2135. X
  2136. X  LONG SPFieee();
  2137. X
  2138. X#ifdef MULTI
  2139. X  geta4();
  2140. X#endif
  2141. X
  2142. X  Pict = GenNPict;
  2143. X
  2144. X  /* Signal Parent that we have accessed GenNPict */
  2145. X
  2146. X  Signal( mTask, pSigMask );
  2147. X
  2148. X  /* Lower our priority while we generate */
  2149. X
  2150. X  SetTaskPri( FindTask(0), TaskPri );
  2151. X
  2152. X  Pict->GenChildState = GENINCOMPLETE;
  2153. X
  2154. X  if (GetTaskSig( Pict ) == UNSUCCESSFUL) {
  2155. X    Pict->GenChildState = NOSIGSTATE;
  2156. X
  2157. X  } else {
  2158. X    Pict->GenChildState = GENINCOMPLETE;
  2159. X
  2160. X    if ( Pict->pNode.ln_Type == MANDPICT ) {
  2161. X
  2162. X      switch ( Pict->MathMode ) {
  2163. X        case 0:
  2164. X             MandelbrotInt32( Pict );
  2165. X             break;
  2166. X
  2167. X        case 2:
  2168. X        case 4:
  2169. X             MandelbrotIEEE( Pict );
  2170. X             break;
  2171. X
  2172. X        case 3:
  2173. X             MandelbrotInt32II( Pict );
  2174. X             break;
  2175. X
  2176. X        case 1: {
  2177. X               /*
  2178. X                * Constraints for IEEE to FFP conversion
  2179. X                *
  2180. X                *  1. SPFieee() expects 32 bit IEEE floats
  2181. X                *  2. The C language always promotes floats to doubles for
  2182. X                *     parameter passing.
  2183. X                *  3. doubles are 64 bits wide
  2184. X                *
  2185. X                * Therefore I must do the following:
  2186. X                *
  2187. X                *  1. Convert double parameters to float
  2188. X                *  2. Take the address of the floats and cast them to *ULONG
  2189. X                *  3. Indirect off the ULONG pointers that are pointing to
  2190. X                *     32 IEEE format floats (gross eh?) as parameters to FFP
  2191. X                *     Mandelbrot function.
  2192. X                */
  2193. X
  2194. X             /* 32 bit IEEE float variables */
  2195. X
  2196. X             float StartX_float, StartY_float, GapX_float, GapY_float;
  2197. X
  2198. X             /* convert 64 bit IEEE variables into 32 bit IEEE variables */
  2199. X
  2200. X             StartX_float = Pict->RealLow;
  2201. X             StartY_float = Pict->ImagLow + Pict->CurLine*Pict->RealGap;
  2202. X             GapX_float   = Pict->RealGap;
  2203. X             GapY_float   = Pict->ImagGap;
  2204. X
  2205. X             /*
  2206. X              * calculate pointers and convert them to pointers to ULONG
  2207. X              * so that when we indirect off of these and pass the results
  2208. X              * as parameters they are not promoted to doubles.
  2209. X              */
  2210. X
  2211. X
  2212. X             MandelbrotFFP( Pict,
  2213. X                            *( (ULONG *) &StartX_float ),
  2214. X                            *( (ULONG *) &StartY_float ),
  2215. X                            *( (ULONG *) &GapX_float   ),
  2216. X                            *( (ULONG *) &GapY_float   ));
  2217. X             }
  2218. X             break;
  2219. X      }
  2220. X    } else {
  2221. X
  2222. X      switch ( Pict->MathMode ) {
  2223. X
  2224. X        case 0:
  2225. X        case 3:
  2226. X             JuliaInt32( Pict );
  2227. X             break;
  2228. X
  2229. X        case 2:
  2230. X        case 4:
  2231. X             JuliaIEEE( Pict );
  2232. X             break;
  2233. X
  2234. X        case 1: {
  2235. X             /*
  2236. X              * Constraints for IEEE to FFP conversion
  2237. X              *
  2238. X              *  1. SPFieee() expects 32 bit IEEE float
  2239. X              *  2. The C language always promotes floats to doubles for
  2240. X              *     parameter passing.
  2241. X              *  3. doubles are 64 bits wide
  2242. X              *
  2243. X              * Therefore I must do the following:
  2244. X              *
  2245. X              *  1. Convert double parameters to float
  2246. X              *  2. Take the address of the floats and cast them to *ULONG
  2247. X              *  3. Indirect off the ULONG pointers that are pointing to
  2248. X              *     32 IEEE format floats (gross eh?) as parameters to FFP
  2249. X              *     Julia function.
  2250. X              */
  2251. X
  2252. X             /* 32 bit IEEE float variables */
  2253. X
  2254. X             float JuliaX_float, JuliaY_float;
  2255. X             float StartX, StartY, GapX, GapY;
  2256. X
  2257. X             /* convert 64 bit IEEE variables into 32 bit IEEE variables */
  2258. X
  2259. X             JuliaX_float = Pict->Real;
  2260. X             JuliaY_float = Pict->Imag;
  2261. X             StartX = Pict->RealLow;
  2262. X             StartY = Pict->ImagLow;
  2263. X             GapX   = Pict->RealGap;
  2264. X             GapY   = Pict->ImagGap;
  2265. X
  2266. X             /*
  2267. X              * calculate pointers and convert them to pointers to ULONG
  2268. X              * so that when we indirect off of these and pass the results
  2269. X              * as parameters they are not promoted to doubles.
  2270. X              */
  2271. X
  2272. X             JuliaFFP( Pict, *( (ULONG *) &JuliaX_float ),
  2273. X                             *( (ULONG *) &JuliaY_float ),
  2274. X                             *( (ULONG *) &StartX ),
  2275. X                             *( (ULONG *) &StartY ),
  2276. X                             *( (ULONG *) &GapX ),
  2277. X                             *( (ULONG *) &GapY ) );
  2278. X             }
  2279. X             break;
  2280. X      }
  2281. X    }
  2282. X    Pict->GenChildState = GENCOMPLETE;
  2283. X  }
  2284. X
  2285. X#ifdef MULTI
  2286. X
  2287. X  /* Indicate that generation has finished for this task */
  2288. X
  2289. X  Signal( mTask, mSigMask );               /* signal parent as to change */
  2290. X
  2291. X  while (Pict->GenState != KILLSTATE) {    /* Wait for task to be removed */
  2292. X
  2293. X    while (Pict->GenState == GENERATESTATE) {   /* spin 'till parent kills us */
  2294. X    }
  2295. X
  2296. X    /* accept any pauses that the parent may send too late */
  2297. X
  2298. X    if (Pict->GenState == PAUSESTATE) {
  2299. X      ChildSignal(Pict);  /* signal back so parent doesn't hang */
  2300. X    }
  2301. X  }
  2302. X
  2303. X  /* We've been informed that we will die, so free up resources */
  2304. X
  2305. X  FreeSignal( Pict->gSigBit );
  2306. X  Signal( mTask, pSigMask );               /* signal death O.K. */
  2307. X  Wait( 0L );                              /* stop here forever */
  2308. X#endif
  2309. X}
  2310. X
  2311. XInitMand( Pict )
  2312. X  register struct Picture *Pict;
  2313. X{
  2314. X
  2315. X  Pict->Real   = 0.0;
  2316. X  Pict->Imag   = 0.0;
  2317. X}
  2318. X
  2319. XSetWindowActive( Window, Active )
  2320. X  register struct Window *Window;
  2321. X  char Active;
  2322. X{
  2323. X  struct Picture *Pict;
  2324. X
  2325. X  if ( Window ) {
  2326. X
  2327. X    Pict = (struct Picture *) Window->UserData;
  2328. X
  2329. X    if ( ! (Pict->Flags & BORDERLESS_PROJ)) {
  2330. X      Window->Title[0] = Active;
  2331. X      SetWindowTitles( Window, Window->Title, -1 );
  2332. X    }
  2333. X  }
  2334. X}
  2335. X
  2336. X/*
  2337. X * Free up old memory and get memory for new picture
  2338. X */
  2339. XGetCountsMemory( Pict )
  2340. X  register struct Picture *Pict;
  2341. X{
  2342. X  /* free up old pictures iteration count pile */
  2343. X
  2344. X  FreeCounts( Pict );
  2345. X
  2346. X  /* Allocate memory for new picture */
  2347. X
  2348. X  Pict->CountsSize = Pict->CountX * Pict->CountY * sizeof(SHORT);
  2349. X  Pict->Counts     = (SHORT *) safeAllocMem(Pict->CountsSize, MEMF_CLEAR );
  2350. X
  2351. X  if (Pict->Counts == NULL) {
  2352. X
  2353. X    Pict->CountsSize = Pict->CountX * sizeof(SHORT);
  2354. X    Pict->Counts     = (SHORT *) safeAllocMem(Pict->CountsSize, MEMF_CLEAR);
  2355. X
  2356. X    if (Pict->Counts != NULL)
  2357. X      Pict->Flags     |= NO_RAM_GENERATE;
  2358. X
  2359. X  } else {
  2360. X
  2361. X    Pict->Flags     &= ~NO_RAM_GENERATE;
  2362. X  }
  2363. X}
  2364. X
  2365. XFreeCounts( Pict )
  2366. X  register struct Picture *Pict;
  2367. X{
  2368. X  if ( Pict->Counts ) {
  2369. X
  2370. X    FreeMem( Pict->Counts, Pict->CountsSize );
  2371. X    Pict->Counts = NULL;
  2372. X  }
  2373. X}
  2374. X
  2375. Xstruct Gadget *
  2376. XMakePictGads( Type )
  2377. X  register int Type;
  2378. X{
  2379. X  register struct Gadget    *gadget;
  2380. X  register struct Gadget *Newgadget;
  2381. X  register struct Gadget *Firstgadget;
  2382. X  register struct IntuiText  *Intui;
  2383. X  register char *str;
  2384. X
  2385. X  struct Border *Border, *MakeShadow();
  2386. X
  2387. X  register int i,j,k;
  2388. X
  2389. X  struct IntuiText *ShadowIntui();
  2390. X
  2391. X  j = TOPMARG;
  2392. X
  2393. X  if ( Type == MANDPICT ) {
  2394. X    k = 4;
  2395. X  } else {
  2396. X    k = 5;
  2397. X  }
  2398. X
  2399. X  Firstgadget = NULL;
  2400. X
  2401. X  for (i = 0; i < k; i++) {
  2402. X
  2403. X    Newgadget = MakeBool(-15,j, 12,12, 0,(PICTTYPE<<WINDTYPEBITS)+i,NULL);
  2404. X
  2405. X    if (Newgadget) {
  2406. X
  2407. X      if ( i == 0 ) {
  2408. X
  2409. X        Firstgadget = Newgadget;
  2410. X
  2411. X      } else {
  2412. X
  2413. X        gadget->NextGadget = Newgadget;
  2414. X      }
  2415. X
  2416. X      Newgadget->Flags      |= GRELRIGHT;
  2417. X      Newgadget->Activation |= RIGHTBORDER;
  2418. X
  2419. X      gadget = Newgadget;
  2420. X
  2421. X      j += 14;
  2422. X
  2423. X      switch( i ) {
  2424. X        case  0:  str = "C"; break;
  2425. X        case  1:  str = "G"; break;
  2426. X        case  2:  str = "I"; break;
  2427. X        case  3:  str = "O"; break;
  2428. X        case  4:  str = "J"; break;
  2429. X      }
  2430. X
  2431. X      Intui = ShadowIntui( str, 3, 3);
  2432. X
  2433. X      if (Intui == NULL) {
  2434. X        FreeGadgets( Firstgadget );
  2435. X      }
  2436. X
  2437. X      gadget->GadgetText = Intui;
  2438. X
  2439. X#define NUMPATCHCORNERS 5
  2440. X
  2441. X      Border = MakeShadow( NORMALPEN, NUMPATCHCORNERS );
  2442. X
  2443. X      if ( Border ) {
  2444. X        InitPatch( Border );
  2445. X        Border->NextBorder = (struct Border *) gadget->GadgetRender;
  2446. X        gadget->GadgetRender = (APTR) Border;
  2447. X      }
  2448. X
  2449. X    } else {
  2450. X
  2451. X      if (Firstgadget)
  2452. X        FreeGadgets( Firstgadget );
  2453. X
  2454. X      return( NULL );
  2455. X    }
  2456. X  }
  2457. X  return( Firstgadget );
  2458. X}
  2459. X
  2460. XSetGenGad( Pict )
  2461. X  register struct Picture *Pict;
  2462. X{
  2463. X  register struct Window *Window;
  2464. X  register struct Gadget *Gadget;
  2465. X  register struct IntuiText *Intui;
  2466. X  register char c;
  2467. X  register int  place;
  2468. X
  2469. X  if (Pict == NULL)
  2470. X    return;
  2471. X
  2472. X  if (Pict->Flags & BORDERLESS_PROJ)
  2473. X    return;
  2474. X
  2475. X  Window = Pict->Window;
  2476. X
  2477. X  if (Window) {
  2478. X
  2479. X    if ( Pict->gTask )
  2480. X      c = 'S';
  2481. X    else
  2482. X      c = 'G';
  2483. X
  2484. X    Gadget = Pict->Gadgets->NextGadget;
  2485. X
  2486. X    place = RemoveGadget( Window, Gadget );
  2487. X
  2488. X    Intui = Gadget->GadgetText;
  2489. X
  2490. X    Intui = Intui->NextText;
  2491. X    Intui->IText[0] = c;
  2492. X
  2493. X    Intui = Intui->NextText;
  2494. X    Intui->IText[0] = c;
  2495. X
  2496. X    AddGadget( Window, Gadget, place );
  2497. X
  2498. X    RefreshGadgets( Pict->Gadgets, Window, NULL );
  2499. X  }
  2500. X}
  2501. X
  2502. XInitPatch( Border )
  2503. X  register struct Border *Border;
  2504. X{
  2505. X  register SHORT *NewCounts;
  2506. X
  2507. X  NewCounts = Border->XY;
  2508. X
  2509. X  *NewCounts++ = 3;       *NewCounts++ = 11;
  2510. X  *NewCounts++ = 2;       *NewCounts++ = 11;
  2511. X  *NewCounts++ = 2;       *NewCounts++ = 2;
  2512. X  *NewCounts++ = 11;      *NewCounts++ = 2;
  2513. X  *NewCounts++ = 11;      *NewCounts++ = 3;
  2514. X
  2515. X} /* InitPatch */
  2516. X
  2517. X/*
  2518. X * Open the Picture window
  2519. X */
  2520. XOpenPicture( Pict )
  2521. X  struct Picture    *Pict;
  2522. X{
  2523. X  extern struct Window *OpenMyWind();
  2524. X
  2525. X  register struct Window    *Window;
  2526. X  register struct NewWindow *NewWind;
  2527. X
  2528. X  register LONG width, height;
  2529. X  register LONG extrax,extray;
  2530. X
  2531. X  struct Gadget *gadgets, *MakePictGads();
  2532. X
  2533. X  if ( Pict->Window == NULL ) {
  2534. X
  2535. X    width  = Pict->CountX;
  2536. X    height = Pict->CountY;
  2537. X
  2538. X    NewWind = Pict->NewWind;
  2539. X
  2540. X    if (Pict->Flags & BORDERLESS_PROJ) {
  2541. X
  2542. X      NewWind->Flags = ACTIVATE | REPORTMOUSE | NOCAREREFRESH |
  2543. X                       SMART_REFRESH | BORDERLESS;
  2544. X      NewWind->Title = NULL;
  2545. X      Pict->Gadgets  = gadgets = NULL;
  2546. X
  2547. X      if (Pict->LeftEdge+Pict->CountX+LEFTMARG+RIGHTMARG == screen->Width &&
  2548. X          Pict->TopEdge +Pict->CountY+TOPMARG+BOTMARG    == screen->Height) {
  2549. X
  2550. X        Pict->LeftMarg  = LEFTMARG;
  2551. X        Pict->RightMarg = RIGHTMARG;
  2552. X        Pict->TopMarg   = TOPMARG;
  2553. X        Pict->BotMarg   = BOTMARG;
  2554. X      } else {
  2555. X
  2556. X        Pict->LeftMarg  = 0;
  2557. X        Pict->RightMarg = 0;
  2558. X        Pict->TopMarg   = 0;
  2559. X        Pict->BotMarg   = 0;
  2560. X      }
  2561. X    } else {
  2562. X
  2563. X      NewWind->Flags = WINDOWCLOSE | WINDOWDEPTH | WINDOWSIZING |
  2564. X                       WINDOWDRAG | ACTIVATE | REPORTMOUSE | NOCAREREFRESH |
  2565. X                       SMART_REFRESH;
  2566. X      NewWind->Title = (UBYTE *) Pict->Title;
  2567. X      Pict->Gadgets  = gadgets = MakePictGads( Pict->pNode.ln_Type );
  2568. X
  2569. X      Pict->LeftMarg  = LEFTMARG;
  2570. X      Pict->RightMarg = RIGHTMARG;
  2571. X      Pict->TopMarg   = TOPMARG;
  2572. X      Pict->BotMarg   = BOTMARG;
  2573. X    }
  2574. X
  2575. X    width  += Pict->LeftMarg + Pict->RightMarg;
  2576. X    height += Pict->TopMarg  + Pict->BotMarg;
  2577. X
  2578. X    extrax = width - screen->Width;
  2579. X    extray = height - screen->Height;
  2580. X
  2581. X    if ( extrax > 0 || extray > 0 ) {
  2582. X
  2583. X      ThrowTask(  Pict);
  2584. X      FreeCounts( Pict);
  2585. X      DispErrMsg("Picture too big. Regenerate",0);
  2586. X
  2587. X      if ( extrax > 0 ) {
  2588. X        Pict->CountX -= extrax;
  2589. X        width -= extrax;
  2590. X      }
  2591. X
  2592. X      if ( extray > 0 ) {
  2593. X        Pict->CountY -= extray;
  2594. X        height -= extray;
  2595. X      }
  2596. X    }
  2597. X
  2598. X    NewWind->LeftEdge = Pict->LeftEdge;
  2599. X    NewWind->TopEdge  = Pict->TopEdge;
  2600. X
  2601. X    Window = OpenMyWind(NewWind, screen, gadgets, width, height );
  2602. X
  2603. X    Pict->Window  = Window;
  2604. X
  2605. X    if (Window == NULL) {
  2606. X
  2607. X      DispErrMsg("Can't open picture window",0);
  2608. X      FreeGadgets( Pict->Gadgets );
  2609. X      ThrowPict(Pict);
  2610. X      return( -1 );
  2611. X
  2612. X    } else {
  2613. X
  2614. X      CurWind = Window;
  2615. X      DisplayMsg();
  2616. X
  2617. X      SetAPen(  Window->RPort, NORMALPEN );
  2618. X
  2619. X      if (Pict->Flags & BORDERLESS_PROJ) {
  2620. X        RectFill( Window->RPort, Pict->LeftMarg, Pict->TopMarg,
  2621. X                  NewWind->Width-Pict->RightMarg-1,
  2622. X                  NewWind->Height-Pict->BotMarg-1);
  2623. X      } else {
  2624. X        RectFill( Window->RPort, Pict->LeftMarg, Pict->TopMarg,
  2625. X                  NewWind->Width, NewWind->Height);
  2626. X      }
  2627. X
  2628. X      Window->UserData = (BYTE *) Pict;
  2629. X
  2630. X      MoveResize( Pict->Window, &Pict->SizingGadget );
  2631. X      BorderWindow( Window );
  2632. X
  2633. X      if (Pict->CycleOn) {
  2634. X        CreateCycle();
  2635. X      }
  2636. X    }
  2637. X  }
  2638. X  SetGenGad( Pict );
  2639. X  return( 0 );
  2640. X} /* OpenPicture */
  2641. X
  2642. XMoveResize( Window, RetGadget )
  2643. X  register struct Window *Window;
  2644. X  register struct Gadget **RetGadget;
  2645. X{
  2646. X  register struct Gadget *Gadget;
  2647. X  register int place;
  2648. X
  2649. X  Gadget = Window->FirstGadget;
  2650. X
  2651. X  while ( Gadget && !(Gadget->GadgetType & SIZING)) {
  2652. X    Gadget = Gadget->NextGadget;
  2653. X  }
  2654. X
  2655. X  if (Gadget) {
  2656. X
  2657. X    *RetGadget = Gadget;
  2658. X
  2659. X    place = RemoveGadget( Window, Gadget );
  2660. X
  2661. X    if (XScale == 0)
  2662. X      Gadget->LeftEdge -= 2;
  2663. X
  2664. X    if (YScale == 0)
  2665. X      Gadget->TopEdge  -= 3;
  2666. X    else
  2667. X      Gadget->TopEdge  -= 1;
  2668. X
  2669. X    AddGadget( Window, Gadget, place );
  2670. X
  2671. X    RefreshGList( Gadget, Window, NULL, 1);
  2672. X  }
  2673. X}
  2674. X
  2675. X/*
  2676. X * Close the Mandelbrot Window
  2677. X */
  2678. XClosePicture( Pict )
  2679. X  register struct Picture   *Pict;
  2680. X{
  2681. X  register struct Window    *Window;
  2682. X  register struct NewWindow *NewWindow;
  2683. X
  2684. X  if ( (Window = Pict->Window) != NULL) {
  2685. X
  2686. X    KillCycle();
  2687. X    FreeScrollTemp(Pict);
  2688. X
  2689. X    Pict->LeftEdge = Window->LeftEdge;
  2690. X    Pict->TopEdge = Window->TopEdge;
  2691. X
  2692. X    CloseMyWind(Window, Pict->Gadgets );
  2693. X
  2694. X    Pict->Window = NULL;
  2695. X    Pict->Gadgets = NULL;
  2696. X    Pict->Flags &= ~LENS_DISPLAYED;
  2697. X  }
  2698. X}
  2699. SHAR_EOF
  2700. echo "End of archive 4 (of 9)"
  2701. # if you want to concatenate archives, remove anything after this line
  2702. exit
  2703.